A Tour of the Dart Language(译文):一Dart基础

原创
2018/10/11 12:01
阅读数 1K

当下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同时支持多行注释和文档注释。更多查阅Comments

int

一种类型。其他内置类型是String、List和bool.

42

数字。数字是一种编译期常量。

print()

简便的方法输出显示。

'...'(or "...")

字符串

$variableName (or ${expression})

字符串插值。查阅Strings

语法跟kotlin、scala(f"xxxx$var")是相似的

main()

特殊、必须的顶级函数,在app启动时执行。查阅The main() function.

var

不用类型定义变量的方式.

注意:这个站点的代码遵循Dart style guide约定

重要概念

当您在学习Dart语言时,牢记这些概念和事实:

  • 变量里存储的都是对象,对象是某个class的一个实例。数字、函数、null也是对象。所有对象均继承自Object

一切皆为对象,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没有pulicprotectedprivate关键字。如果标识符号始于下划线(_),则是library私有的。更多详情查阅Libraries and visibility

跟go一样尿性约定俗成没有可见空间关键字,而且可见空间控制非常鸡肋逼您二选一!

  • 标识符以字母或者下划线开头,紧随任意字符数字组合。

大部分语言都是这么套路

  • Dart具有表达式(有返回值)和语句(无返回值)。栗子:条件表达式 condition ? expr1 : expr2返回expr1或expr2。相反if-else语句则没有返回值。一个语句可以包含多个表达式,但是一个表达式不能直接包含多个语句。

别想多了Dart跟kotlin、scala不一样:if-else、while是表达式而不是语句。

  • Dart的工具可以报告两种类型的问题:warningerrors。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发布后添加的异步支持相关的有限保留字。在任何函数体标记为asyncasync*sync*中,不能使用awaityield

在表中的其他词是保留字,不能用作标识符。

变量

下面是一个创建变量和初始化例子:

var name = 'Bob';

变量存储引用。名为name的变量包含一个String对象是值为"Bob"对象的引用。 变量name被推断为String类型,也可以指定它的类型。若想要一个对象不限制为某一类型,请遵循设计准则,声明对象为dynamic类型。

dynamic name = 'Bob';

另一种方式是显式声明要推断的类型:

String name = 'Bob';

注意: 这里也遵循 style guide recommendation 本地变量使用var而不是声明类型。

缺省值

未初始化的变量有一个初始值为null。即使是数字类型的变量初始值也是null,因为数字跟任何Dart其他类型一样都是对象。

数字初始值是null,不是0或0.0!

int lineCount;
assert(lineCount == null);

注意:在生产代码中忽略assert()调用。在设计时, assert(condition)若condition不为true将引发异常。详情查阅Assert.

final和const

如果从不打算更改变量,使用finalconst,而不是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。详情查阅DON’T use const redundantly。 非final、非const变量可以修改,即使用到了const值

foo = [1, 2, 3]; // Was const []

不能修改const变量的值:

baz = [42]; // Error: Constant variables can't be assigned a value.

更多使用const创建常量值的内容,查阅ListsMapsClasses

展开阅读全文
打赏
3
5 收藏
分享
加载中
更多评论
打赏
0 评论
5 收藏
3
分享
在线直播报名
返回顶部
顶部