Dart语言简介

Dart是谷歌开发的用于浏览器编程的一门语言,据说其主要目的是替代掉 javascrip。其语法和javascript很相似,但比其简洁,也更容易看懂,可以说是属于一种小清新语言吧。本文基本上是翻译自官 网:http://www.dartlang.org/language-tour/,主要简介Dart语言的主要组成部分:


1.程序基本结构

2.变量

3.内建类型

4.函数

5.控制流程

6.异常


一.程序的基本结构

首先上代码:

  1. main() {  
  2.   // Variables and values  
  3.   var number   = 42;  
  4.   var text     = "The value of number is";  
  5.   
  6.   // Console output  
  7.   print("$text $number.");  
  8. }  

  这段代码很容易懂,也体现了Dart语言的"小清新风格"。

 首先,main是必须定义的方法,是程序入口。

//双斜杠后面是程序注释,也可以使用/*  */来包含注释

var是声明变量,像javascript类似,可以不必声明变量的具体类型,与javascript不同,Dart不建议这样做。

双引号""或单引号''包围的表示字符串

print()方法是一个方便向屏幕打印的函数


二.变量

声明一个变量并赋值:

  1. var name = 'Bob'

  如果只声明变量不赋值,则默认值为null,包括数字类型变量。在Dart里一切都是对象,数字也是一种对象类型,如:

  1. num lineCount;  
  2. lineCount ==null;// true   

  从上面的代码可以看出声明变量时可以指定变量类型,这也是Dart建议的方式,像下面这样:

  1. String name = 'Bob';  

  使用final修饰还可以声明常量:

 常量一经定义其值就不能再改变。

  1. final String name = 'Bob' ;  

 三.内建类型:

Dart内建了以下五种对象类型:

1.字符串String

就像上面的示例,在字符串中可以使用表达式,${expression},该表达式的值将会作为字符串的一部分。如果表达式只是一个变量,可以不加大括号,即:$var

  1. var s ='string interpolation';  
  2. print('Dart has $s, which is very handy.');  
  3. print('That deserves all caps. ${s.toUpperCase()} is very handy!');  

 比较字符串相等可以使用==号

字符串有一些常用方法,如:startWith,endWith,contains. 字符串是不可变对象,也就是说它的值一旦创建就不会再变。要使用可变字符串,可以使用StringBuffer对象,类似于java中的 StringBuffer类,它的值是可变的,使用该对象的toString方法可以生成字符串。

  1. var sb = new StringBuffer();  
  2.   
  3. sb.add("Use a StringBuffer");  
  4. sb.addAll(["for ""efficient ""string ""creation "]);  
  5. sb.add("if you are ").add("building lots of strings.");  
  6.   
  7. var fullString = sb.toString();  
  8.   
  9. print(fullString); // Use a StringBuffer for efficient string creation  
  10.                    // if you are building lots of strings.  
  11.   
  12. sb.clear();     

  2.数字

在Dart中数字有两种类型,int和double,它们都是num的子类,它们提供一系列方法进行运算,另外Math类中提供了num中没有的其它数学运算。

int表示没有小数点的数字:

  1. var x = 1;  
  2. var hex = 0xDEADBEEF;  
  3. var bigInt = 346534658346524376592384765923476592834765956739847564749587396;  

 而double表示有小数点的数:

  1. var y = 1.1;  
  2. var exponents = 1.42e5;  

  数字与字符串的转换:

  1. // string -> int  
  2. var one = Math.parseInt("1");                   // 1  
  3.   
  4. // string -> double  
  5. var onePointOne = Math.parseDouble("1.1");      // 1.1  
  6.   
  7. // int -> string  
  8. String oneAsString = 1.toString();              // "1"  
  9.   
  10. // double -> string  
  11. String piAsString = 3.14159.toStringAsFixed(2); // "3.14"  

 3.布尔类型

Dart只有两种布尔类型:true和false。在javascript中1和非实对象都可以当成true,但是在Dart中不行,在Dart中只有当变量等于true时才会当成true对待,否则当成false对待。

  1. var name = 'Bob';  
  2. if (name) {  
  3.   print("You have a name!"); // Prints in JavaScript, not in Dart  
  4. }  

   在上面的示例中,Dart不会打印任何内容,因为name!=true.

所在,不能直接使用if (nonboolean_value)这样的方式来判断一个对象,要显示地检查对象的值:

  1. // Check for an empty string.  
  2. var fullName = '';  
  3. if (fullName.isEmpty()) {  
  4.   print("Please enter a full name");  
  5. }  
  6.   
  7. // Check for zero.  
  8. var hitPoints = 0;  
  9. if (hitPoints == 0) {  
  10.   print("Uh oh! Looks like you died.");  
  11. }  
  12.   
  13. // Check for null.  
  14. var unicorn = null;  
  15. if (unicorn == null) {  
  16.   print("You didn't wish hard enough. Wish harder.");  
  17. }  
  18.   
  19. // Check for NaN.  
  20. var iMeantToDoThis = 0/0;  
  21. if (iMeantToDoThis.isNaN()) {  
  22.   print("0/0 is not a number.");  
  23. }  

 4.数组

在Dart中数组也叫列表list.

定义一个数组:

  1. var list = [1,2,3];  

  操作数组:

  1. var list = [1,2,3];  
  2. print(list.length); // the # of elements: 3  
  3. print(list[1]);     // the second item: 2  

  给数组添加元素:

  1. var list = [1,2,3];  
  2. list.add(4);  

  从数组中删除一定范围内的元素:

  1. var list = [1,2,3,4];  
  2. list.removeRange(21); // remove the third element  

  创建固定长度的数组:

  1. var list = new List(3); //fixed-size list (full of null values)  

 注意:固定长度的数组不能调用add,removeRange等方法改变其大小。


可以使用for, for...in, 或forEach()几种方式遍历数组,

使用for:

  1. var list = [1,2,3];  
  2. for (var x = 0; x < list.length; x++) {  
  3.   print('$x: ${list[x]}');  
  4. }  

  for...in:

  1. var list = [1,2,3];  
  2. for (final x in list) {  
  3.   print(x);  
  4. }  

  forEach():

  1. var list = [1,2,3
  2. void printElement(element) => print(element);  
  3. list.forEach(printElement);  

  可更简洁的方式:

  1. var list = [1,2,3];  
  2. list.forEach((element) => print(element));  

  list的父类是Collection,它提供了一系列操作集合的方法。


5.映射

即Map对象,定义一个map对象可以使用如下方式:

  1. var gifts = {                         // a map literal  
  2. // keys       values  
  3.   "first"  : "partridge",  
  4.   "second" : "turtledoves",  
  5.   "fifth"  : "golden rings"};  

  使用这种方式,key只能使用字符串,如果使用Map构造函数,则key可以使用其他类型,如:

  1. var map = new Map();                  // use a Map constructor  
  2. map[1] = "partridge";                 // key is 1; value is "partridge"  
  3. map[2] = "turtledoves";               // key is 2; value is "turtledoves"  
  4. map[5] = "golden rings";              // key is 5; value is "golden rings"  

  在map中值可以是任何对象或null,也可以像javascript中那样直接给map添加一个映射项:

  1. var gifts = { "first""partridge" };  
  2. gifts["fourth"] = "calling birds";    // add a key-value pair  

  取得一个映射项的值:

  1. var gifts = { "first""partridge" };  
  2. print(gifts['first']);                // partridge  

  如果map不存在某个key,则获取该key对应的值会返回null

map中也提供length方法返回映射的项数,remove方法可以删除一个项

Map.from()方法可以复制一个映射:

  1. var gifts = { "first""partridge" };  
  2. var regifts = new Map.from(gifts);  
  3. print(regifts['first']);   

  使用forEach()方法可以遍历一个Map:

  1. var gifts = {  
  2.   "first" : "partridge",  
  3.   "second""turtledoves",  
  4.   "fifth" : "golden rings"};  
  5. gifts.forEach((k,v) => print('$k : $v'));  

 如果只想获取所有key或所有values,可以使用getKeys或getValues方法。


四.函数

定义一个函数:

  1. String say(String from, String msg) => "$from says $msg";  

 也可以使用简洁的写法:

  1. say(from, msg) => "$from says $msg";  

  调用它:

  1. print(say("Bob""Hello")); // "Bob says Hello"  

  => e;是{return e;}的简写,因此上面的函数定义相当于:

  1. say(from, msg) {  
  2.   return "$from says $msg";  
  3. }  

  函数还支持可选参数:

  1. String say(String from, String msg, [String device]) {  
  2.   var result = "$from says $msg";  
  3.   if (device != null) {  
  4.     result = "$result with a $device";  
  5.   }  
  6.   return result;  
  7. }  

 可选参数在调用时可以传入也可不传入,比较下面两种调用方式:

  1. print(say("Bob""Howdy")); // Bob says Howdy  
  2. print(say("Bob""Howdy""smoke signal"));  
  3. // Bob says Howdy with a smoke signal  

 可以为可选参数设置默认值,这样在调用时如果没有传入则使用默认值:

  1. String say(String from, String msg, [String device='carrier pigeon']) {  
  2.   var result = "$from says $msg";  
  3.   if (device != null) {  
  4.     result = "$result with a $device";  
  5.   }  
  6.   return result;  
  7. }  

  也可以使用名称参数来使用可选参数:

  1. print(say("Bob""Howdy", device: "tin can and string"));  
  2. // Bob says Howdy with a tin can and string  

  函数也可以像对象一样作为函数返回值或作为参数传递给其它函数:

  1. bool isOdd(num i) => i % 2 == 1;  
  2. List ages = [1,4,5,7,10,14,21];  
  3. List oddAges = ages.filter(isOdd);  

 

五.控制流程

if and else:

  1. if (isRaining()) {  
  2.   you.bringRainCoat();  
  3. else if (isSnowing()) {  
  4.   you.wearJacket();  
  5. else {  
  6.   car.putTopDown();  
  7. }  

  for loops:

  1. for (int i = 0; i < candidates.length; i++) {  
  2.   candidates[i].interview();  
  3. }  

 在for循环中还可以定义函数来对当前索引值进行操作,如:

  1. main() {  
  2.   var callbacks = [];  
  3.   for (var i = 0; i < 2; i++) {  
  4.     callbacks.add(() => print(i));  
  5.   }  
  6.   callbacks.forEach((c) => c());  
  7. }  

while和do while循环与javascript中一样,break,continue中也一样。

switch使用==来判断对象是否相等。


六异常

Dart中提供了Exception接口来供你实现自定义异常,也提供了一些内置异常类。

也可以把任何对象当异常抛出:

  1. throw new IllegalArgumentException('Value must be greater than zero');  
  2. throw "Out of llamas!";  

  使用catch可以捕获指定异常:

  1. try {  
  2.   breedMoreLlamas();  
  3. catch (final OutOfLlamasException e) {  
  4.   buyMoreLlamas();  
  5. }  

 catch不同的异常,分别处理:

  1. try {  
  2.   breedMoreLlamas();  
  3. catch (final OutOfLlamasException e) {  // a specific exception  
  4.   buyMoreLlamas();  
  5. catch (final Exception e) {             // anything that is an exception  
  6.   print("Unknown exception: $e");  
  7. catch (final e) {                       // no specified type, handles all  
  8.   print("Something really unknown: $e");  
  9. }  

  一个catch里也可以捕获多个异常:

  1. try {  
  2.   breedMoreLlamas();  
  3. catch (final OutOfLlamasException oole,  
  4.         final NoFemaleLlamasException nfle) {  
  5.   print('Out of luck');  
  6. }  

  像java一样,可以使用finally来执行必须执行的代码:

  1. try {  
  2.   breedMoreLlamas();  
  3. catch (final e) {  
  4.   print("Error: $e");  // handle exception first  
  5. finally {  
  6.   cleanLlamaStalls();  // then run finally  
  7. }  

 

posted on 2012-03-19 10:33  我本少年  阅读(1541)  评论(0编辑  收藏  举报