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
 - }
 
                    
                
                
            
        
浙公网安备 33010602011771号