Dart是谷歌开发的用于浏览器编程的一门语言,据说其主要目的是替代掉javascrip。其语法和javascript很相似,但比其简洁,也更容易看懂,可以说是属于一种小清新语言吧。本文基本上是翻译自官网:http://www.dartlang.org/language-tour/,主要简介Dart语言的主要组成部分:
1.程序基本结构
2.变量
3.内建类型
4.函数
5.控制流程
6.异常
ps:由于编辑器的限制,本文大部分代码被标示成了java代码,实为Dart
一.程序的基本结构
首先上代码:
main() { // Variables and values var number = 42; var text = "The value of number is"; // Console output print("$text $number."); }
这段代码很容易懂,也体现了Dart语言的"小清新风格"。
首先,main是必须定义的方法,是程序入口。
//双斜杠后面是程序注释,也可以使用/* */来包含注释
var是声明变量,像javascript类似,可以不必声明变量的具体类型,与javascript不同,Dart不建议这样做。
双引号""或单引号''包围的表示字符串
print()方法是一个方便向屏幕打印的函数
二.变量
声明一个变量并赋值:
var name = 'Bob';
如果只声明变量不赋值,则默认值为null,包括数字类型变量。在Dart里一切都是对象,数字也是一种对象类型,如:
num lineCount; lineCount ==null;// true
从上面的代码可以看出声明变量时可以指定变量类型,这也是Dart建议的方式,像下面这样:
String name = 'Bob';
使用final修饰还可以声明常量:
常量一经定义其值就不能再改变。
final String name = 'Bob' ;
三.内建类型:
Dart内建了以下五种对象类型:
1.字符串String
就像上面的示例,在字符串中可以使用表达式,${expression },该表达式的值将会作为字符串的一部分。如果表达式只是一个变量,可以不加大括号,即:$var
var s ='string interpolation'; print('Dart has $s, which is very handy.'); print('That deserves all caps. ${s.toUpperCase()} is very handy!');
比较字符串相等可以使用==号
字符串有一些常用方法,如:startWith,endWith,contains.字符串是不可变对象,也就是说它的值一旦创建就不会再变。要使用可变字符串,可以使用StringBuffer对象,类似于java中的StringBuffer类,它的值是可变的,使用该对象的toString方法可以生成字符串。
var sb = new StringBuffer(); sb.add("Use a StringBuffer"); sb.addAll(["for ", "efficient ", "string ", "creation "]); sb.add("if you are ").add("building lots of strings."); var fullString = sb.toString(); print(fullString); // Use a StringBuffer for efficient string creation // if you are building lots of strings. sb.clear();
2.数字
在Dart中数字有两种类型,int和double,它们都是num的子类,它们提供一系列方法进行运算,另外Math类中提供了num中没有的其它数学运算。
int表示没有小数点的数字:
var x = 1; var hex = 0xDEADBEEF; var bigInt = 346534658346524376592384765923476592834765956739847564749587396;
而double表示有小数点的数:
var y = 1.1; var exponents = 1.42e5;
数字与字符串的转换:
// string -> int var one = Math.parseInt("1"); // 1 // string -> double var onePointOne = Math.parseDouble("1.1"); // 1.1 // int -> string String oneAsString = 1.toString(); // "1" // double -> string String piAsString = 3.14159.toStringAsFixed(2); // "3.14"
3.布尔类型
Dart只有两种布尔类型:true和false。在javascript中1和非实对象都可以当成true,但是在Dart中不行,在Dart中只有当变量等于true时才会当成true对待,否则当成false对待。
var name = 'Bob'; if (name) { print("You have a name!"); // Prints in JavaScript, not in Dart }
在上面的示例中,Dart不会打印任何内容,因为name!=true.
所在,不能直接使用if (nonboolean_value )这样的方式来判断一个对象,要显示地检查对象的值:
// Check for an empty string. var fullName = ''; if (fullName.isEmpty()) { print("Please enter a full name"); } // Check for zero. var hitPoints = 0; if (hitPoints == 0) { print("Uh oh! Looks like you died."); } // Check for null. var unicorn = null; if (unicorn == null) { print("You didn't wish hard enough. Wish harder."); } // Check for NaN. var iMeantToDoThis = 0/0; if (iMeantToDoThis.isNaN()) { print("0/0 is not a number."); }
4.数组
在Dart中数组也叫列表list.
定义一个数组:
var list = [1,2,3];
操作数组:
var list = [1,2,3]; print(list.length); // the # of elements: 3 print(list[1]); // the second item: 2
给数组添加元素:
var list = [1,2,3]; list.add(4);
从数组中删除一定范围内的元素:
var list = [1,2,3,4]; list.removeRange(2, 1); // remove the third element
创建固定长度的数组:
var list = new List(3); //fixed-size list (full of null values)
注意:固定长度的数组不能调用add,removeRange等方法改变其大小。
可以使用for , for ...in , 或forEach()几种方式遍历数组,
使用for:
var list = [1,2,3]; for (var x = 0; x < list.length; x++) { print('$x: ${list[x]}'); }
for...in:
var list = [1,2,3]; for (final x in list) { print(x); }
forEach():
var list = [1,2,3]; void printElement(element) => print(element); list.forEach(printElement);
可更简洁的方式:
var list = [1,2,3]; list.forEach((element) => print(element));
list的父类是Collection,它提供了一系列操作集合的方法。
5.映射
即Map对象,定义一个map对象可以使用如下方式:
var gifts = { // a map literal // keys values "first" : "partridge", "second" : "turtledoves", "fifth" : "golden rings"};
使用这种方式,key只能使用字符串,如果使用Map构造函数,则key可以使用其他类型,如:
var map = new Map(); // use a Map constructor map[1] = "partridge"; // key is 1; value is "partridge" map[2] = "turtledoves"; // key is 2; value is "turtledoves" map[5] = "golden rings"; // key is 5; value is "golden rings"
在map中值可以是任何对象或null,也可以像javascript中那样直接给map添加一个映射项:
var gifts = { "first": "partridge" }; gifts["fourth"] = "calling birds"; // add a key-value pair
取得一个映射项的值:
var gifts = { "first": "partridge" }; print(gifts['first']); // partridge
如果map不存在某个key,则获取该key对应的值会返回null
map中也提供length方法返回映射的项数,remove方法可以删除一个项
Map.from()方法可以复制一个映射:
var gifts = { "first": "partridge" }; var regifts = new Map.from(gifts); print(regifts['first']);
使用forEach()方法可以遍历一个Map:
var gifts = { "first" : "partridge", "second": "turtledoves", "fifth" : "golden rings"}; gifts.forEach((k,v) => print('$k : $v'));
如果只想获取所有key或所有values,可以使用getKeys或getValues方法。
四.函数
定义一个函数:
String say(String from, String msg) => "$from says $msg";
也可以使用简洁的写法:
say(from, msg) => "$from says $msg";
调用它:
print(say("Bob", "Hello")); // "Bob says Hello"
=> e;是{return e;}的简写,因此上面的函数定义相当于:
say(from, msg) { return "$from says $msg"; }
函数还支持可选参数:
String say(String from, String msg, [String device]) { var result = "$from says $msg"; if (device != null) { result = "$result with a $device"; } return result; }
可选参数在调用时可以传入也可不传入,比较下面两种调用方式:
print(say("Bob", "Howdy")); // Bob says Howdy print(say("Bob", "Howdy", "smoke signal")); // Bob says Howdy with a smoke signal
可以为可选参数设置默认值,这样在调用时如果没有传入则使用默认值:
String say(String from, String msg, [String device='carrier pigeon']) { var result = "$from says $msg"; if (device != null) { result = "$result with a $device"; } return result; }
也可以使用名称参数来使用可选参数:
print(say("Bob", "Howdy", device: "tin can and string")); // Bob says Howdy with a tin can and string
函数也可以像对象一样作为函数返回值或作为参数传递给其它函数:
bool isOdd(num i) => i % 2 == 1; List ages = [1,4,5,7,10,14,21]; List oddAges = ages.filter(isOdd);
五.控制流程
if and else:
if (isRaining()) { you.bringRainCoat(); } else if (isSnowing()) { you.wearJacket(); } else { car.putTopDown(); }
for loops:
for (int i = 0; i < candidates.length; i++) { candidates[i].interview(); }
在for循环中还可以定义函数来对当前索引值进行操作,如:
main() { var callbacks = []; for (var i = 0; i < 2; i++) { callbacks.add(() => print(i)); } callbacks.forEach((c) => c()); }
while和do while循环与javascript中一样,break,continue中也一样。
switch使用==来判断对象是否相等。
六异常
Dart中提供了Exception接口来供你实现自定义异常,也提供了一些内置异常类。
也可以把任何对象当异常抛出:
throw new IllegalArgumentException('Value must be greater than zero'); throw "Out of llamas!";
使用catch可以捕获指定异常:
try { breedMoreLlamas(); } catch (final OutOfLlamasException e) { buyMoreLlamas(); }
catch不同的异常,分别处理:
try { breedMoreLlamas(); } catch (final OutOfLlamasException e) { // a specific exception buyMoreLlamas(); } catch (final Exception e) { // anything that is an exception print("Unknown exception: $e"); } catch (final e) { // no specified type, handles all print("Something really unknown: $e"); }
一个catch里也可以捕获多个异常:
try { breedMoreLlamas(); } catch (final OutOfLlamasException oole, final NoFemaleLlamasException nfle) { print('Out of luck'); }
像java一样,可以使用finally来执行必须执行的代码:
try { breedMoreLlamas(); } catch (final e) { print("Error: $e"); // handle exception first } finally { cleanLlamaStalls(); // then run finally }