注释
Dart 的单行注释也是 //
,注释内容最好是个完整的句子,通常以大写字母开头,以句点或其他标点符号结束:
// Not if there is nothing before it.
if (_chunks.isEmpty) return false;
/* ... */
只适合用来注掉某一段暂时不用的代码,不适合当成注释使用。
///
是 Dart 推荐使用的文档注释语法,dartdoc 会根据文档注释生成 HTML 文档,使用方括号可以链接到一个类、方法、字段等位置:
/// Feeds your llama [Food].
///
/// The typical llama eats one bale of hay per week.
void feed(Food food) {
// …
}
由于历史原因, Dart 也支持 JavaDoc 样式的文档注释 /** ... */
,但这种类型的文档注释会产生两个无实际内容的行,对于使用 *
标志列表项等场景并不方便,所以推荐使用 ///
文档注释。
变量
可以赋值给变量的都是对象,包括数字、函数和 null
对象,对象都是类的实例,都继承自 Object
。
变量存的是引用。
虽然 Dart 是强类型语言,但是类型声明是可选的,因为 Dart 可以推断出变量究竟是什么类型的。
可以使用 var
关键字声明变量而无需指定具体类型,如 var name = 'Bob';
,var number = 42;
。
有些操作需要处理任何可能的对象,如 log()
方法需要调用给定对象的 toString()
。而在 Dart 中有两种类型: Object
和 dynamic
,Object
适合表示可以是任何对象的场景,而 dynamic
适合表示更复杂的类型,如意味着 Dart 的类型系统已经不足以表示的一系列允许的类型,或者值来自 interop 或 其他超过静态类型系统范围的类型,或者你想明确地声明运行时动态处理的变量:
void log(Object object) {
print(object.toString());
}
/// Returns a Boolean representation for [arg], which must
/// be a String or bool.
bool convertToBool(dynamic arg) {
if (arg is bool) return arg;
if (arg is String) return arg == ‘true’;
throw new ArgumentError(‘Cannot convert $arg to a bool.’);
}
final 和 const
如果变量永远不会改变,可以使用 final
或 const
去声明,final 变量只能赋值一次,const 变量是编译时常量(也是隐式 final
的),final 的顶级类变量是在其第一次被使用时初始化的。实例变量可以是 final
的,但不能是 const
的。
const
不单能声明常量,还可以创建常量值,或者声明可以创建常量值的构造器。
内置的类型
num
类型有两个子类型 int
和 double
,int
型位数不超过64位,在 Dart VM 上是 -263 到 263 - 1,double
是64位浮点数,遵循 IEEE 754 标准。
String
类型是 UTF-16 编码,可以使用单引号也可以使用双引号,因此可以灵活的避免字符串限定符。可以利用 ${expression}
在字符串中使用表达式的值,如果表达式是个标识符,那么 {}
可以省略。字符串拼接可以使用紧邻的字符串或者 +
号:
var s1 = 'String ’
‘concatenation’
" works even over line breaks.";
var s2 = 'The + operator ’ + ‘works, as well.’;
多行的字符串可以使用三个单引号或三个双引号包裹。 可以使用前缀 r
创建原始字符串:
// 在原始字符串中,即使是 \n 也不再是特殊字符了
var s = r"In a raw string, even \n isn’t special.";
Dart 的集合 API 包含 lists, sets, 和 maps。List
可以使用传统构造器创建,也可以使用 []
语法创建,Map
可以使用传统构造器创建,也可以使用 {}
语法创建:
// Use a List constructor.
var vegetables = new List();
// Or simply use a list literal.
var fruits = [‘apples’, ‘oranges’];
// Maps can be built from a constructor.
var searchTerms = new Map();
// Maps often use strings as keys.
var hawaiianBeaches = {
‘Oahu’: [‘Waikiki’, ‘Kailua’, ‘Waimanalo’],
‘Big Island’: [‘Wailea Bay’, ‘Pololu Beach’],
‘Kauai’: [‘Hanalei’, ‘Poipu’]
};
List
和 Set
都实现了 Iterable
,可以通过迭代器去遍历,而 Map
可以通过它的keys
和 values
属性获取迭代器。