Dart语言简介
Dart是谷歌开发的用于浏览器编程的一门语言,据说其主要目的是替代掉 javascrip。其语法和javascript很相似,但比其简洁,也更容易看懂,可以说是属于一种小清新语言吧。本文基本上是翻译自官 网:http://www.dartlang.org/language-tour/,主要简介Dart语言的主要组成部分:
1.程序基本结构
2.变量
3.内建类型
4.函数
5.控制流程
6.异常
一.程序的基本结构
首先上代码:
- 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
- }