当下Dart中文资料很少。以其啃人家半吊子的二、三手资料,不如爬蜗牛自己试着处男译一次技术文档。本系列根据dart官网最新《A Tour of the Dart Language》翻译凑合着看吧。注意:译注、个人乱评的都是这种斜体段落出现
Dart基础
以下dart代码展示了dart的大概功能:
// 定义函数printInteger(int aNumber) { print('The number is $aNumber.'); // 答应到控制台}// 这里是app开始执行的地方main() { var number = 42; // 声明且初始化变量 printInteger(number); // 调用函数.}
下面这个程序用途适用于所有Dart app:
// This is a comment.
单行注释。Dart同时支持多行注释和文档注释。更多查阅
int
一种类型。其他是String、List和bool.
42
数字。数字是一种编译期常量。
print()
简便的方法输出显示。
'...'(or "...")
字符串
$variableName (or ${expression})
字符串插值。查阅
语法跟kotlin、scala(f"xxxx$var")是相似的
main()
特殊、必须的顶级函数,在app启动时执行。查阅.
var
不用类型定义变量的方式.
注意:这个站点的代码遵循约定
重要概念
当您在学习Dart语言时,牢记这些概念和事实:
- 变量里存储的都是对象,对象是某个class的一个实例。数字、函数、null也是对象。所有对象均继承自类
一切皆为对象,java还有int、long、float、double等原生类型,C#、kotlin、scala则是彻底的皆为对象。
- 虽然Dart是强类型语言,但类型声明是可选的因为Dart可以推导类型。在上面的代码中。
number
变量被推断出是int
类型。若不想明确指明预期类型,dynamic
。
类型推导成熟的编译技术,现在的语言基本是标配的功能。
- Dart支持泛型,像
List<int>
(一个整数列表)或List<dynamic>
(任何类型对象的列表)。 - Dart支持顶级函数(如
main()
),以及绑定到类或对象的函数(分别是静态和实例方法)。还可以在函数中创建函数(嵌套或本地函数) - 同样的,Dart支持顶级变量,以及绑定到类或对象的变量(静态和实例变量)。实例变量通常称为域(fields)或属性(properties)。
顶级函数实际跟kotlin是一样的。
- 与java不同,Dart没有
pulic
、protected
和private
关键字。如果标识符号始于下划线(_),则是library私有的。更多详情查阅。
跟go一样尿性约定俗成没有可见空间关键字,而且可见空间控制非常鸡肋逼您二选一!
- 标识符以字母或者下划线开头,紧随任意字符数字组合。
大部分语言都是这么套路
- Dart具有表达式(
有返回值
)和语句(无返回值
)。栗子:condition ? expr1 : expr2
返回expr1或expr2。相反语句则没有返回值。一个语句可以包含多个表达式,但是一个表达式不能直接包含多个语句。
别想多了Dart跟kotlin、scala不一样:if-else、while是表达式而不是语句。
- Dart的工具可以报告两种类型的问题:
warning
和errors
。warning表明代码可能无法正常工作,但它不阻止程序运行。编译期errors阻止执行;运行时errors将引发运行异常。
关键字
下表是Dart特别对待的词。
abstract<sup>2</sup> | dynamic<sup>2</sup> | implements<sup>2</sup> | show<sup>1</sup> |
---|---|---|---|
as<sup>2</sup> | else | import<sup>2</sup> | static 2 |
assert | enum | in | super |
async<sup>1</sup> | export<sup>2</sup> | interface<sup>2</sup> | switch |
await 3 | external<sup>2</sup> | is | sync<sup>1</sup> |
break | extends | library<sup>2</sup> | this |
case | factory<sup>2</sup> | mixin<sup>2</sup> | throw |
catch | false | new | true |
class | final | null | try |
const | finally | on<sup>1</sup> | typedef<sup>2</sup> |
continue | for | operator<sup>2</sup> | var |
covariant<sup>2</sup> | Function<sup>2</sup> | part<sup>2</sup> | void |
default | get<sup>2</sup> | rethrow | while |
deferred<sup>2</sup> | hide<sup>1</sup> | return | with |
do | if | set<sup>2</sup> | yield<sup>3</sup> |
奶奶的oschina不支持markdown<sup></sup>角标
避免使用表里的词用于标识符。不过,在必要条件下可以使用角标标记的词用作标识符:
- 角标1是上下文关键词。意味着只作用在特殊地方。在其他地方可以是有效的标识符。
- 角标2是内置标识符。为了简化将 JavaScript 代码移植到 Dart,这些关键字在大多数地方有效,但不能用作类或类型名, 也不能作为导入前缀。
- 角标3是新加的。Dart1.0发布后添加的相关的有限保留字。在任何函数体标记为
async
、async*
或sync*
中,不能使用await
或yield
。
在表中的其他词是保留字,不能用作标识符。
变量
下面是一个创建变量和初始化例子:
var name = 'Bob';
变量存储引用。名为name
的变量包含一个String
对象是值为"Bob"对象的引用。 变量name
被推断为String类型,也可以指定它的类型。若想要一个对象不限制为某一类型,请遵循,声明对象为dynamic
类型。
dynamic name = 'Bob';
另一种方式是显式声明要推断的类型:
String name = 'Bob';
注意: 这里也遵循 本地变量使用var而不是声明类型。
缺省值
未初始化的变量有一个初始值为null。即使是数字类型的变量初始值也是null,因为数字跟任何Dart其他类型一样都是对象。
数字初始值是null,不是0或0.0!
int lineCount;assert(lineCount == null);
注意:在生产代码中忽略assert()调用。在设计时, assert(condition)若condition不为true将引发异常。详情查阅.
final和const
如果从不打算更改变量,使用final
或const
,而不是var
或类型。一个final变量仅能设置一次;一个const变量是编译期常量(const是隐式的final变量),一个顶级final类变量在第一次使用时被初始化。
注意:实例变量可以是final的但不能使用const。final实例变量必须在构造函数之前初始化-定义时初始化,由构造函数参数初始化,或在构造函数的。
原文很拗口.Note: Instance variables can be final but not const. Final instance variables must be initialized before the constructor body starts — at the variable declaration, by a constructor parameter, or in the constructor’s initializer list.
下面是创建并设置final变量例子:
final name = 'Bob'; //无类型声明final String nickname = 'Bobby';
不能修改final变量值:
name = 'Alice'; // Error: a final variable can only be set once.
const变量用于编译期常量。如果是类级const变量,标记其为static const
。在声明变量的时候 将值设置为编译期常量, 如数字或字符串、常量或恒定数字的算术运算:
const bar = 1000000; // 气压单位 (dynes/cm2)const double atm = 1.01325 * bar; // 标准大气.
const
关键字不仅用于常量声明。也可用于创建常量值,以及声明创建常量值的构造函数。任何变量都可以具有常量值。
var foo = const [];final bar = const [];const baz = []; // 等价于 `const []`
如上面的baz
,在const声明初始化表达式处可以忽略const。详情查阅。 非final、非const变量可以修改,即使用到了const值
foo = [1, 2, 3]; // Was const []
不能修改const变量的值:
baz = [42]; // Error: Constant variables can't be assigned a value.
更多使用const创建常量值的内容,查阅、和。