注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

韩国恺的博客

hanguokai.com

 
 
 

日志

 
 

Dart 语言入门(一)——概述和基本语法  

2012-11-16 17:09:15|  分类: Dart |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
更新日期:2012年11月20日

一、语言概述

Dart 语言在2011年10月由 Google 发布,并在2012年10月发布第一个里程碑版本 M1。Dart 作为一种结构化的Web开发语言,既让人感觉熟悉,又足够灵活。既适用于快速原型开发,又适用于组织大型的代码库。既可以用在桌面版和移动版的浏览器中,也可以在服务器端使用。总体上说,Dart 语言是感觉熟悉的并且符合程序员的直觉,特别是你已经掌握了 Java、JavaScript 等语言的话。

Dart 是一门很特别的语言。我觉得最有特色的特性是可选类型,他在动态语言的基础上,结合了静态语言的优点。另一个特色是,Dart中的类和接口是统一的,类即接口,你可以继承一个类,也可以实现一个类(接口)。除此之外还有很多非常不错的特性,比如工厂构造函数和命名构造函数,getter/setter方法,语言级别的级联调用等。作为现代语言的基本功能,自然也包含了良好的面向对象和并发编程的支持。

编程语言并不是孤立存在的,Dart也是这样,他由语言规范、虚拟机、类库和工具等组成:
  • SDK:SDK 包含 Dart VM、dart2js、Pub、库和工具。
  • Dartium:内嵌 Dart VM 的 Chromium ,可以在浏览器中直接执行 dart 代码。
  • Dart2js:将 Dart 代码编译为 JavaScript 的工具。
  • Dart Editor:基于 Eclipse 的全功能 IDE,并包含以上所有工具。支持代码补全、代码导航、快速修正、重构、调试等功能。

Dart 两种运行模式:
  • 检查模式(checked):进行类型检查,如果发现实际类型与声明或期望的类型不匹配就报错。
  • 生产模式(production):不进行类型检查,忽略声明的类型信息,忽略 assert 语句。

检查模式运行较慢,生产模式运行快。但检查模式可以及早地发现程序在的问题,所以建议在开发过程中使用检查模式。而在正式环境中使用生产模式运行。Dart VM 和 Dartium 默认在生产模式下运行,而我们用 Dart Editor 开发时默认在检查模式下运行,通过选项可以设置使用不同的模式。

Dart 两种运行环境(和 JavaScript 类似):
  • 客户端模式(client):在浏览器中运行,通过 dart:html 库与页面交互,操作 DOM、CSS,HTML5 编程等。
    • 在支持 Dart VM 的浏览器中直接执行 dart 代码,如 Dartium。
    • 在不支持 Dart VM 的浏览器中,dart 代码被编译为 JavaScript 执行。
  • 服务器模式(server):在操作系统中,以独立 VM 中运行,可以使用 dart:io 库读写文件、套接字等。

Hello World

main() {

print('hello world!');

}

Dart 程序是从顶层的 main() 函数开始执行的。
在命令行中运行代码:

dart hello.dart

或者以检查模式运行:

dart --checked hello.dart

更多命令行选项执行 dart --verbose 可见。


二、基本语法

Dart 中的所有东西都是对象,包括数字、函数等,它们都继承自 Object,并且对象的默认值都是 null(包括数字)。

Dart 中的语句以分号结束,并且不是可选的。

Dart 的类型是可选的。Dart 语言本质上是动态类型语言,可以使用 var 声明变量,一个变量也可以被赋予不同类型的对象。但大多数情况,我们不会去改变一个变量的类型。在 Dart 中也可以使用类型来声明变量,就像在静态语言中做的那样。关于可选类型,详见我的另一篇文章《Dart 中的可选类型》

Dart 支持顶层的变量和函数,就像 JavaScript 一样,它并不要求你像 Java 那样把所有的东西都放到类中。

Dart 中以下划线开头的标识符是私有的。除此之外,都是公有的。注意私有单元不是类,而是库。也就是说,在同一个库中全部可见,私有只是对库的外部不可见。

变量声明:

var str1 = 'abc'; //使用 var 声明一个变量

String str2 = 'abc'; //也可以使用类型声明

final str3 = 'abc'; //也可以用 final 声明其不可变

final String str4 = 'abc'; //final 和类型结合也可以


int x;//声明了一个 int 类型变量 x,但是没有初始化,此时 x 是 null


字符串语法:

var str1 = "hello";//双引号字符串,可以内嵌单引号

var str2 = 'hello';//单引号字符串,可以内嵌双引号


var str3 = """尊敬的客户,您好:

您购买的产品已经发货,请您准备接收。

感谢您购买本公司的产品"""; //使用三个双引号或单引号的多行字符串


var str4 = 'hello' ' ' 'world'; //相邻字符串字面量自动连接

assert(str4 == 'hello world'); //assert 是语言内置的断言函数,仅在检查模式下有效,如果断言失败则程序立刻终止


var name = 'HanGuokai';

var str5 = 'Hi $name'; // 通过$,可以在字符串中可以插入变量的值,${}可以插入表达式。单引号或双引号的字符串都可以使用。


var str6 = r'raw string, print \n'; //声明原始字符串,可以避免\的转义作用,在正则表达式里特别有用

注意:在 Dart 中,字符串不支持 + 操作符,如 str1 + str2 。有三种替代方式,1)字符串插值 "$str1$str2",2)如果是字符串字面量,可以使用相邻字符串连接,3)构造一个 StringBuffer 对象,利用 add 方法添加多个字符串,特别是在循环中或构造较大的字符串时,使用 StringBuffer 提高性能。

数字:
Dart 中的数字是 num,它有两个子类型 int 和 double,int 是任意长度的整数,double 是双精度浮点数。一般情况下,主要应该使用 num 和 int 类型,double 很少使用(因为它限制输入只能是 double 而不能是 int)。注意,数字类型也是对象,因此可以在数字上调用各种方法。其实,加减乘除等基本运算符就是对象上的方法。

//字面量

var x = 1;
var hex = 0xAB21D;

var bigInt = 2342304802342342234235234524;

var y = 1.1;
var exponents = 1.42e5;


//方法

assert((-1).abs() == 1);

assert((5.3).ceil() == 6);


//与字符串的相互转换

var i = int.parse('1'); // 和 double.parse()

var str = 3.14159.toStringAsFixed(2); // 除了标准的 toString 还有很多相关的方法


布尔值:
Dart 中的 bool 类型只有 true 和 false。在检查模式下,任何其它类型的对象都不能当作 bool 类型来使用;在生产模式下,非 bool 类型的对象都被当作 false。这点与 JavaScript 不同,但这样的规则更简单、清晰,不容易犯错。

if(1){ //在检查模式运行会报错,在生产模式下则认为是 false,不会执行 if 条件下的代码。

...

}


List 和 Map
Dart 语言中内置了常用的 List 和 Map 。List 是 Collection 的子类型,另外 Queue 和 Set 也是 Collection 的子类型 。

var list = [1,2,3];// 或者 new List();

list.add(4);

assert(list.length == 4);
assert(list[1] == 2);


var map = {

'one': 1,

'two': 2

}; // 或者 new Map();

assert(map['one'] == 1);

map['four'] = 4;

assert(map.length == 3);

Map 的字面量语法要求 key 必须字符串,但如果是用构造函数创建的,则任何对象都可以是 key。


流程控制语句
Dart 中控制语句和其它语言类似,支持 if else、条件表达式( ? : ),switch,for 和 while 循环等。

// if 语句

if (a < b) {


} else if (a == b) {


} else {//a > b


}


// for 循环

for (int i = 0; i < 10; i++){


}


// for in 循环

var list = [1, 2, 3];

for(var x in list) {

print(x);

}


// 集合对象可以使用 forEach 方法遍历其中的对象

[1, 2, 3].forEach((x) => print(x));


// while 循环

while(!isDone()) {

}


// do while 循环

do {

} while(!isDone());

在循环中也可以使用 break 和 continue ,用法和 Java 一样。

switch 语句
Dart 语言中 switch 语句要求比较的对象只能是num、String 或常量对象,并且一个 switch 语句中只能使用相同的类型。每个 case 语句要么是空的,要么是以 break、continue、return 或 throw 结尾。否则如果执行了一个没有以 break、continue、return 或 throw 结尾的非空的 case 语句时,会出现一个 fall-through 错误。default 语句在没有匹配的情况下才执行。

var x = 1;

switch(x) {

case 1:

print(1);

break; // 如果没有 break 语句运行时就会报错

case 2:

print(2);

break;

case 3: //允许空的 case,这里如果匹配了 3,就会执行后面的语句,并在遇到的第一个 break 时退出

case 4:

print(4);

break;

case 5:

print(5);

continue L7; // 跳过 case 6,继续执行 case 7 的语句

case 6:

print(6);

break;

L7:

case 7:
print(7);

break;

default:

print('unknow');

}


异常控制语句
Dart 同样支持异常处理的 try catch finally 和 throw 语句。和 Java 不同,Dart 中所有的异常都是 unchecked 的,这样就不要求你强制捕获某些异常。虽然 Dart 提供了 Exception 和 Error 类型以及许多预定义的子类,但是在 Dart 中可以抛出任意非 null 对象作为异常。

throw 语句

throw new Exception('something wrong');//抛出一个典型的异常


throw 'something wrong';//抛出一个字符串对象作为异常


catch 语句
Dart 中的 catch 语句有点特别,与 Java 和 JavaScript 都不同。动态类型语言 JavaScript 无法捕获一种特定类型的异常,你需要自己用 instanceof 判断。而静态类型语言 Java 可以捕获特定的异常类型,但只能抛出或捕获 Throwable 及其子类型的异常或错误。Dart 既可以捕获容易类型的异常,又可以捕获特定类型的异常。

try {
...
} on FormatException { // 只捕获 FormatException 类型的异常
...
}


try {
...
} on FormatException { // 捕获 FormatException 类型的异常
print('Format exception');
} on Exception catch(e) { // 捕获所有其它 Exception 类型的异常

print('Unknown exception: $e');
} catch(e) { // 捕获所有类型的异常
print('Something really unknown: $e');
}

上面的代码使用 on、catch 或者 on 和 catch 的组合捕获异常。catch 语句用于获得异常对象,on 语句用于指定异常的类型。

finally 语句
finally 语句和 Java 一样,可以 try finally 或者 try catch finally。

try {

} catch(e) { // 处理异常

} finally { // 清理资源

}


注释
Dart 中的注释和其它语言类似:
单行注释 //
多行注释 /*  */

文档注释,类似于 javadoc,Dart 也有自己的 dartdoc 用于生成 api 文档。一种是常见的 /**   */  ,另一种是三斜杠 /// 。三斜杠 /// 如果在连续的多行上使用效果和 /**  */ 一样。Dart 的文档注释中还可以使用 Markdown 的语法格式,这样你就可以实现一些简单的 HTML 的功能。另外,文档注释中方括号 [ ] 具有特殊的意义,在词法作用域内,方括号内引用的标识符会生成相应的链接,包括:类、参数、方法、字段、顶层变量和函数。

/**
* The llama (Lama glama) is a domesticated South American
* camelid, widely used as a meat and pack animal by Andean
* cultures since pre-Hispanic times.
*/
class Llama {
String name;

/**
* Feeds your llama [Food].
*
* The typical llama eats one bale of hay per week.
*/
void feed(Food food) {
//...
}

/// Exercises your llama with an [activity] for
/// [timeLimit] minutes.
void exercise(Activity activity, int timeLimit) {
//...
}

}


  评论这张
 
阅读(5904)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018