Dart语言简介

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
}
 

 

 


你可能感兴趣的:(简介)