一个基础的Dart程序
[In]
1 | // main为Dart程序入口 |
[Out]
1 | The number is 58. |
- Dart单行注释用
//
,多行注释用/**/
(同Java) var
是一种不需要指定类型的声明方式int
是一种数据类型,对应的还有String
、List
和bool
类型- 字符串的标识用单、双引号均可(同Python、JS)
- 字符串中支持
${number}
表达式, 单字符变量时可简化为$number
(同JS的`${number}`)
当你在学习Dart语言时,需要清楚这些概念:
- 所有的东西都是一个对象,每个对象都是一个class的实例,即使是数字、函数、
null
都是对象,并且所有的对象都集成自Object类。- 尽管Dart语言是一种强类型语言,但你在类型声明时仍然可以不指定类型,因为Dart可以自动进行类型推断。在上面的代码中,
number
变量的类型就被推断为int
,当你并不想显式地声明类型时,你可以使用指定的类型dynamic来标识。- Dart语言同样支持泛型,如
List<int>
、List<dynamic>
(同Java)。- Dart语言支持顶级方法(即不与类绑定的方法,如上的
main
方法),以及绑定类和实例的方法(分别对应静态方法和实例方法),而且还支持方法嵌套(同Python、JS)。- 和Java不同的是,Dart语言并不支持
public
、protected
、private
这些关键字,它是通过前缀_
来标识为私有域的(同Python),参。
变量
这是一个创建并初始化变量的例子
1 | var name = 'Bob'; |
name
变量类型被推断为String
,你也能更改为指定的类型。如果一个变量的类型并不限制于单一类型,你也可以使用dynamic
或Object
进行声明,如:
1 | dynamic name = 'Bob'; |
同样也可以选择指定的声明方式
1 | String name = 'Bob'; |
但根据Dart推荐的编码风格,在局部变量中使用var
要更优于指定的类型声明。
默认值
Dart中声明时如果未初始化,会被自动初始化为null
1 | int lineCount; |
注:
assert
只在开发环境有效,在实际的生产环境无效
final与const
final
和const
标识该变量只能被赋值一次,区别在于final
是运行时赋值,const
是编译时赋值。
1 | final String nickname = 'Jack'; |
const
不仅可以用来声明变量,还能用来创建常量值,如:
1 | // 此时不能在对列表a进行更新操作 |
内置类型
数字型
包含int
和double
,不包含float
常用的类型转换
1 | // String -> int |
字符串
单引号、双引号均可
字符串拼接时,换行可省略加号,如
1
2
3
4var a = '123'
'456';
print(a);
// Out: 123456字符串可以用索引,但不支持负值索引(区分于Python),如
1
2
3var a = 'Jack';
print(a[1]);
// Out: a
列表
在Dart语言中,数组即列表
[In]
1 | void main() { |
[Out]
1 | list is [a, cc, d] |
字典
[In]
1 | void main() { |
[Out]
1 | map is {b: 22, c: 3} |
函数
Dart是一门完全面向对象的语言,即使它的函数也是一个对象,并且有自己的类型——Function
。这就意味着函数可以被赋值为一个变量,或者作为一个参数在其他函数之间传递。
对于只包含一个表达式的方法体,你也可以使用=>
的简写形式,如:
1 | void say() { |
可选参数
Dart的可选参数分为命名可选参数
和位置可选参数
两种(两者之间互斥,即不能同时使用)。
命名可选参数
[In]
1 | void main() { |
[Out]
1 | Jack's age is 27. |
位置可选参数
[In]
1 | void main() { |
[Out]
1 | Tom's age is 27.Love game. |
默认参数值
参数可用=
声明默认值,默认值只能是编译时常量。
注:
命名可选参数
的默认参数值可使用:
指定,但对于位置可选参数
不支持,推荐统一使用=
的默认参数指定方式
匿名函数
[In]
1 | void main() { |
[Out]
1 | Android |
特殊操作符
a ~/ b
<=>(a / b) as int
is
<=> Java的instanceof
a?.b
<=>a == null ? null : a.b
a??b
<=>a == null ? b : a
a ??= b
<=>a = a == null ? b : a
a as String
<=> Java的(String) a
..
级联操作符1
2
3
4
5
6
7
8
9
10var button = querySelector('#confirm');
button.text = 'Confirm';
button.classes.add('important');
button.onClick.listen((e) => window.alert('Confirmed!'));
// 该写法等价上述写法
querySelector('#confirm') // Get an object.
..text = 'Confirm' // Use its members.
..classes.add('important')
..onClick.listen((e) => window.alert('Confirmed!'));
异常
1 | // 抛异常 |
重载操作符
1 | class Vector { |
生成器
sync* + yield
返回Iterable
对象async* + yield
返回Stream
对象
1 | Iterable<int> naturalsTo(int n) sync* { |
如果生成器返回值是可迭代的,亦可使用yield*
来提高性能,如:
1 | Iterable<int> naturalsDownFrom(int n) sync* { |
可调用的类
给类定义call
方法能使得当前类是Callable的(同Python)
1 | class WannabeFunction { |