Dart(2.2) - 简单入门

一个最基本的 Dart 程序

下面的代码使用了很多 Dart 中最基本的特性:

// 定义个方法。
printNumber(num aNumber) {
  print('The number is $aNumber.'); // 在控制台打印内容。
}

// 这是程序执行的入口。
main() {
  var number = 42; // 定义并初始化一个变量。
  printNumber(number); // 调用一个方法。
}

注意:无返回值的时候void写不写都OK

下面是上面代码中使用的一些可以应用到几乎所有 Dart 应用中的特性:

  • //

使用 // 表示后面的文字都是注释。 另外,你还可以使用/* … */

  • int

一种类型,Dart 语言有自己的内嵌类型,如:String, List, bool 是另外几种类型。

  • 42

一个数字字面量。数字字面量是编译时常量。

  • print

一种打印内容的方法。

  • $aNumber

字符串插值:在字符串字面量中引用变量或者表达式,也可以使用${expression}

  • main()

Dart 程序执行的入口方法,每个程序都需要一个这样的方法。 更多详细 The main() function.

  • var

一种不指定类型声明变量的方式。

注意: 我们的代码准守 Dart 代码样式中的规则。 例如: 我们使用两个空格来缩进代码。

重要的概念

在学习 Dart 的时候,请牢记下面一些事实和概念:

  • 所有能够使用变量(variable)引用的都是对象(object), 每个对象都是一个类的实例。在 Dart 中 甚至连数字(numbers)、方法(functions)和 null 都是对象。所有的对象都继承于 Object 类。

  • Dart是强类型语言,类型的标注是可选的,Dart会自动推测类型。在上面的代码中num被推测为int类型。如果不确定类型,使用 dynamic

  • Dart支持泛型,像数组List<int>(a list of integers) 或者List<dynamic> (a list of objects of any type).

  • Dart 支持顶级方法 (例如 main()),同时还支持在类中定义函数。 (静态函数和实例函数)。 你还可以在方法中定义方法 (嵌套方法或者局部方法)。

  • 同样,Dart还支持顶级变量(top-level variables),以及在类中定义变量(静态变量和实例变量)。 实例变量有时候被称之为域(fields)或者属性(properties)。

  • 和 Java 不同的是,Dart没有 publicprotected、 和 private 等关键字。如果一个标识符以 (_)开头,则该标识符在库内是私有的。详情请参考: 库和可见性

  • 标识符可以以字母或者 _ 下划线开头,后面可以是其他字符和数字的组合。

  • Dart表达式 expression语句 statement。比如:条件表达式 condition ? expr1 : expr2拥有值 expr1expr2。对比if-else statement,这里没有值。但是语句经常包含一个或者多个表达式,但是表达式不能包含语句。

  • Dart 工具可以指出两种问题:警告和错误( warnings and errors)。 警告只是说你的代码可能有问题, 但是并不会阻止你的代码执行。 错误可以是编译时错误也可以是运行时错误。遇到编译时错误时,代码将 无法执行;运行时错误将会在运行代码的时候导致一个 异常

关键字(Keywords)

下表是Dart 中的关键字

屏幕快照 2019-03-27 上午10.21.01.png

应该避免使用这些关键字作为标识符,然而,如果有需要,关键词中带有上标的可以作为标识符

  • 关键词中上标为1的是上下文关键词(contextual keywords),用于具体的地方。它们是可以用于任何地方是有效的标识符

  • 关键词中上标为2的是内嵌标识符(built-in identifiers)。 这些关键字是为了方便把 JavaScript 代码移植到 Dart而存在的,可以用于大多数地方,但是不能用于类(class)或类型名(type names),或者作为前缀倒入(import prefixes

  • 关键词中上标为3是在 Dart 1.0 发布以后又新加的,用于 支持异步相关的特性。 你不能在标记为 asyncasync*、或者 sync* 的方法体内使用 asyncawait、或者 yield 作为标识符。 详情请参考:异步支持

所以其他单词都是保留词。 你不能用保留词作为关键字。

变量(Variables)

下面是声明变量并赋值的示例:

var name = 'Bob';

变量是一个引用。上面名字为 name 的变量引用了 一个内容为 “Bob” 的String对象。

name变量的类型被自动推测为String,但是我们能够指定具体的类型来修改它的类型。如果对象并没有被限制为单一类型,可以指定为 Object 或者dynamic类型,更多了解design guidelines.

dynamic name = 'Bob';

另外一种可选方式就是显示声明变量类型

String name = 'Bob';

默认值(Default value)

Uninitialized variables have an initial value of null. Even variables with numeric types are initially null, because numbers—like everything else in Dart—are objects.

没有初始化的变量有一个默认值为null。甚至类型为数字的变量如果没有初始化其值也是null,因为数字(numeric)类型也是对象。

int lineCount;
assert(lineCount == null);

注意:在生产模式 assert() 语句被忽略了。在检查模式 assert(*condition*) 会执行,如果条件不为 true 则会抛出一个异常。详情请参考 Assert 部分。

Final和const

如果你从未打算修改一个变量,使用final 或者 const,而不是使用var或者类型。 一个final 变量只能赋值一次;一个 const变量是编译时常量。 (Const 变量是隐式的 final变量。) 顶级的final变量或者类中的final变量在第一次使用的时候初始化。

注意: 实例变量可以为final 但是不能是 constfinal实例变量必须在类的构造器中进行初始化,更多了解initializer list

下面是final变量的示例:

final name = 'Bob'; // Without a type annotation
final String nickname = 'Bobby';

我们不能修改final变量的值

name = 'Alice'; // Error: a final variable can only be set once.

const变量为编译时常量,可以直接定义const和其值。 如果const变量是在类中,请定义为 static conststatic用于修饰成员变量,表示这个变量是属于类的,而不是属于对象的

const bar = 1000000; // Unit of pressure (dynes/cm2)
const double atm = 1.01325 * bar; // Standard atmosphere

const关键字不仅仅只用来定义常量。 有可以用来创建常量值, 还能定义构造函数为const类型的,这种类型的构造函数创建的对象是不可改变的。任何变量都可以有常量值。

var foo = const [];
final bar = const [];
const baz = []; // Equivalent to `const []`

我们能够在初始化表达式的时候省略const关键字,比如上面的baz

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

所以我们不能修改baz

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

总结final和const的区别

final:表示单一赋值,final变量或字段必须初始化。 一旦赋值,就不能改变final变量的值。 final修饰变量

const 的含义在Dart中有点复杂和微妙。

const修饰值,可以在创建集合时使用它,例如const [1,2,3],以及构造对象(代替new),比如const Point(2,3)。这里,const意味着对象的整个深度状态可以在编译时完全确定,并且对象将被冻结并完全不可变。更多有关两者区别可以看 ''const'' and ''final'' keyword in Dart

对于更多信息有关于 const 来创建常量值 Lists, Maps, and Classes.

参考

Dart 语法预览

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,968评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,601评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,220评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,416评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,425评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,144评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,432评论 3 401
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,088评论 0 261
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,586评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,028评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,137评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,783评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,343评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,333评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,559评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,595评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,901评论 2 345