Dart 开发语言概览
本文将从变量和运算符开始到类和库的使用来向你介绍 Dart 编程语言的主要功能,这里假设你已经有使用其它语言进行编程的经验。
你可以通过查看 Dart 库概览 学习更多关于 Dart 核心库的知识。若还想了解更多有关语言功能的详细内容,请参阅 Dart 编程语言规范。
备忘:
你可以通过 DartPad 体验 Dart 的大部分语言功能 (了解更多), 打开 DartPad。
本页面内嵌了一些 DartPads 做例子展示,
如果你只看到了空白的框框(而没有任何内容),请查阅 DartPad 常见问题页面。
一个简单的 Dart 程序
下面的应用程序代码用到了很多 Dart 的基本功能:
// Define a function. void printInteger(int aNumber) {print('The number is $aNumber.'); // Print to console. }// This is where the app starts executing. void main() {var number = 42; // Declare and initialize a variable.printInteger(number); // Call a function. }
下面是上述应用程序中使用到的代码片段,这些代码片段适用于所有(或几乎所有)的 Dart 应用:
// This is a comment.
// 注释。
以双斜杠开头的一行语句称为单行注释。Dart 同样支持多行注释和文档注释。查阅注释获取更多相关信息。
void
一种特殊的类型,表示一个值永远不会被使用。类似于 main()
和 printInteger()
的函数,以 void
声明的函数返回类型,并不会返回值。
int
另一种数据类型,表示一个整型数字。 Dart 中一些其他的内置类型包括 String
、List
和 bool
。
42
表示一个数字字面量。数字字面量是一种编译时常量。
print()
一种便利的将信息输出显示的方式。
'...'
(或 "..."
)
表示字符串字面量。
$variableName
(或 ${expression}
)
表示字符串插值:字符串字面量中包含的变量或表达式。查阅字符串获取更多相关信息。
main()
一个特殊且 必须的 顶级函数,Dart 应用程序总是会从该函数开始执行。查阅 main() 函数 获取更多相关信息。
var
用于定义变量,通过这种方式定义变量不需要指定变量类型。这类变量的类型 (int
) 由它的初始值决定 (42
)。
备忘:
本站的代码遵循 Dart 风格指南 中的约定。
重要概念
当你在学习 Dart 语言时, 应该牢记以下几点:
Everything you can place in a variable is an object, and every object is an instance of a class. Even numbers, functions, and
null
are objects. With the exception ofnull
(if you enable sound null safety), all objects inherit from the Object class.版本提示: Null safety was introduced in Dart 2.12. Using null safety requires a language version of at least 2.12.
所有变量引用的都是 对象,每个对象都是一个 类 的实例。数字、函数以及
null
都是对象。除去null
以外(如果你开启了 空安全), 所有的类都继承于 Object 类。尽管 Dart 是强类型语言,但是在声明变量时指定类型是可选的,因为 Dart 可以进行类型推断。在上述代码中,变量
number
的类型被推断为int
类型。如果你开启了 空安全,变量在未声明为可空类型时不能为
null
。你可以通过在类型后加上问号 (?
) 将类型声明为可空。例如,int?
类型的变量可以是整形数字或null
。如果你 明确知道 一个表达式不会为空,但 Dart 不这么认为时,你可以在表达式后添加!
来断言表达式不为空(为空时将抛出异常)。例如:int x = nullableButNotNullInt!
如果你想要显式地声明允许任意类型,使用
Object?
(如果你 开启了空安全)、Object
或者 特殊类型 dynamic 将检查延迟到运行时进行。Dart 支持泛型,比如
List<int>
(表示一组由 int 对象组成的列表)或List<Object>
(表示一组由任何类型对象组成的列表)。Dart 支持顶级函数(例如
main
方法),同时还支持定义属于类或对象的函数(即 静态 和 实例方法)。你还可以在函数中定义函数(嵌套 或 局部函数)。Dart 支持顶级 变量,以及定义属于类或对象的变量(静态和实例变量)。实例变量有时称之为域或属性。
Dart 没有类似于 Java 那样的
public
、protected
和private
成员访问限定符。如果一个标识符以下划线 (_
) 开头则表示该标识符在库内是私有的。可以查阅 库和可见性 获取更多相关信息。标识符 可以以字母或者下划线 (
_
) 开头,其后可跟字符和数字的组合。Dart 中 表达式 和 语句 是有区别的,表达式有值而语句没有。比如条件表达式
expression condition ? expr1 : expr2
中含有值expr1
或expr2
。与 if-else 分支语句相比,if-else
分支语句则没有值。一个语句通常包含一个或多个表达式,但是一个表达式不能只包含一个语句。Dart 工具可以显示 警告 和 错误 两种类型的问题。警告表明代码可能有问题但不会阻止其运行。错误分为编译时错误和运行时错误;编译时错误代码无法运行;运行时错误会在代码运行时导致 异常。
关键字
下面的表格中列出了 Dart 语言所使用的关键字。
abstract 2 | else | import 2 | show 1 |
as 2 | enum | in | static 2 |
assert | export 2 | interface 2 | super |
async 1 | extends | is | switch |
await 3 | extension 2 | late 2 | sync 1 |
break | external 2 | library 2 | this |
case | factory 2 | mixin 2 | throw |
catch | false | new | true |
class | final | null | try |
const | finally | on 1 | typedef 2 |
continue | for | operator 2 | var |
covariant 2 | Function 2 | part 2 | void |
default | get 2 | required 2 | while |
deferred 2 | hide 1 | rethrow | with |
do | if | return | yield 3 |
dynamic 2 | implements 2 | set 2 |
应该避免使用这些单词作为标识符。但是,带有上标的单词可以在必要的情况下作为标识符:
带有上标 1 的关键字为 上下文关键字,只有在特定的场景才有意义,它们可以在任何地方作为有效的标识符。
带有上标 2 的关键字为 内置标识符,这些关键字在大多数时候都可以作为有效的标识符,但是它们不能用作类名或者类型名或者作为导入前缀使用。
带有上标 3 的关键字为 Dart 1.0 发布后用于 支持异步 相关内容。不能在由关键字
async
、async*
或sync*
标识的方法体中使用await
或yield
作为标识符。
其它没有上标的关键字为 保留字,均不能用作标识符。
变量
下面的示例代码将创建一个变量并将其初始化:
var name = 'Bob';
变量仅存储对象的引用。这里名为 name
的变量存储了一个 String
类型对象的引用,“Bob” 则是该对象的值。
name
变量的类型被推断为 String
,但是你可以为其指定类型。如果一个对象的引用不局限于单一的类型,可以将其指定为 Object
(或 dynamic
)类型。
Object name = 'Bob';
除此之外你也可以指定类型:
String name = 'Bob';
备忘:
本文遵循 风格建议指南 中的建议,通过 var
声明局部变量而非使用指定的类型。
默认值
在 Dart 中,未初始化以及可空类型的变量拥有一个默认的初始值 null
。(如果你未迁移至 空安全,所有变量都为可空类型。)即便数字也是如此,因为在 Dart 中一切皆为对象,数字也不例外。
int? lineCount; assert(lineCount == null);
备忘:
assert()
的调用将会在生产环境的代码中被忽略掉。在开发过程中,assert(condition)
将会在 条件判断 为 false 时抛出一个异常。详情请查阅 Assert。
If you enable null safety, then you must initialize the values of non-nullable variables before you use them:
int lineCount = 0;
You don’t have to initialize a local variable where it’s declared, but you do need to assign it a value before it’s used. For example, the following code is valid because Dart can detect that lineCount
is non-null by the time it’s passed to print()
:
int lineCount;if (weLikeToCount) {lineCount = countLines(); } else {lineCount = 0; }print(lineCount);
Top-level and class variables are lazily initialized; the initialization code runs the first time the variable is used.
Late variables
Dart 2.12 added the late
modifier, which has two use cases:
- Declaring a non-nullable variable that’s initialized after its declaration.
- Lazily initializing a variable.
Often Dart’s control flow analysis can detect when a non-nullable variable is set to a non-null value before it’s used, but sometimes analysis fails. Two common cases are top-level variables and instance variables: Dart often can’t determine whether they’re set, so it doesn’t try.
If you’re sure that a variable is set before it’s used, but Dart disagrees, you can fix the error by marking the variable as late
:
late String description;void main() {description = 'Feijoada!';print(description); }
If you fail to initialize a late
variable, a runtime error occurs when the variable is used.
When you mark a variable as late
but initialize it at its declaration, then the initializer runs the first time the variable is used. This lazy initialization is handy in a couple of cases:
- The variable might not be needed, and initializing it is costly.
- You’re initializing an instance variable, and its initializer needs access to
this
.
In the following example, if the temperature
variable is never used, then the expensive _readThermometer()
function is never called:
// This is the program's only call to _readThermometer(). late String temperature = _readThermometer(); // Lazily initialized.
Final 和 Const
如果你不想更改一个变量,可以使用关键字 final
或者 const
修饰变量,这两个关键字可以替代 var
关键字或者加在一个具体的类型前。一个 final 变量只可以被赋值一次;一个 const 变量是一个编译时常量(const 变量同时也是 final 的)。顶层的 final 变量或者类的 final 变量在其第一次使用的时候被初始化。
备忘:
实例变量 可以是 final
的但不可以是 const
,
下面的示例中我们创建并设置两个 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 修饰类中的变量,则必须加上 static 关键字,即 static const
(译者注:顺序不能颠倒)。在声明 const 变量时可以直接为其赋值,也可以使用其它的 const 变量为其赋值:
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
的赋值就省略掉了 const
。详情请查阅 不要冗余地使用 const。
没有使用 final 或 const 修饰的变量的值是可以被更改的,即使这些变量之前引用过 const
的值。
foo = [1, 2, 3]; // Was const []
常量的值不可以被修改:
baz = [42]; // Error: Constant variables can't be assigned a value.
你可以在常量中使用 类型检查和强制类型转换 (is
和 as
)、 集合中的 if 以及 展开操作符 (...
和 ...?
):
const Object i = 3; // Where i is a const Object with an int value... const list = [i as int]; // Use a typecast. const map = {if (i is int) i: 'int'}; // Use is and collection if. const set = {if (list is List<int>) ...list}; // ...and a spread.
备忘: Although a final
object cannot be modified, its fields can be changed. In comparison, a const
object and its fields cannot be changed: they’re immutable.
可以查阅 Lists、Maps 和 Classes 获取更多关于使用 const
创建常量值的信息。
内置类型
Dart 语言支持下列内容:
- Numbers (
int
,double
) - Strings (
String
) - Booleans (
bool
) Lists (也被称为 arrays)
- Sets (
Set
) - Maps (
Map
) Runes (常用于在
Characters
API 中进行字符替换)- Symbols (
Symbol
) - The value
null
(Null
)
使用字面量来创建对象也受到支持。例如 'This is a string'
是一个字符串字面量,true
是一个布尔字面量。
由于 Dart 中每个变量引用都指向一个对象(一个 类 的实例),通常也可以使用 构造器 来初始化变量。一些内置的类型有它们自己的构造器。例如你可以使用 Map()
来创建一个 map 对象。
Some other types also have special roles in the Dart language:
Object
: The superclass of all Dart classes exceptNull
.Future
andStream
: Used in asynchrony support.Iterable
: Used in for-in loops and in synchronous generator functions.Never
: Indicates that an expression can never successfully finish evaluating. Most often used for functions that always throw an exception.dynamic
: Indicates that you want to disable static checking. Usually you should useObject
orObject?
instead.void
: Indicates that a value is never used. Often used as a return type.
The Object
, Object?
, Null
, and Never
classes have special roles in the class hierarchy, as described in the top-and-bottom section of Understanding null safety.
Numbers
Dart 支持两种 Number 类型:
int
整数值;长度不超过 64 位,具体取值范围 依赖于不同的平台。在 DartVM 上其取值位于 -263 至 263 - 1 之间。在 Web 上,整型数值代表着 JavaScript 的数字(64 位无小数浮点型),其允许的取值范围在 -253 至 253 - 1 之间。
double
64 位的双精度浮点数字,且符合 IEEE 754 标准。
int
和 double
都是 num 的子类。 num 中定义了一些基本的运算符比如 +、-、*、/ 等,还定义了 abs()
、ceil()
和 floor()
等方法(位运算符,比如 >> 定义在 int 中)。如果 num 及其子类不满足你的要求,可以查看 dart:math 库中的 API。
整数是不带小数点的数字,下面是一些定义整数字面量的例子:
var x = 1; var hex = 0xDEADBEEF; var exponent = 8e5;
如果一个数字包含了小数点,那么它就是浮点型的。下面是一些定义浮点数字面量的例子:
var y = 1.1; var exponents = 1.42e5;
You can also declare a variable as a num. If you do this, the variable can have both integer and double values.
num x = 1; // x can have both int and double values x += 2.5;
整型字面量将会在必要的时候自动转换成浮点数字面量:
double z = 1; // Equivalent to double z = 1.0.
版本提示:
在 Dart 2.1 之前,在浮点数上下文中使用整数字面量是错误的。
下面是字符串和数字之间转换的方式:
// String -> int var one = int.parse('1'); assert(one == 1);// String -> double var onePointOne = double.parse('1.1'); assert(onePointOne == 1.1);// int -> String String oneAsString = 1.toString(); assert(oneAsString == '1');// double -> String String piAsString = 3.14159.toStringAsFixed(2); assert(piAsString == '3.14');
整型支持传统的位移操作,比如移位(<<
、>>
和 >>>
)、补码 (~
)、按位与 (&
)、按位或 (|
) 以及按位异或 (^
),例如:
assert((3 << 1) == 6); // 0011 << 1 == 0110 assert((3 | 4) == 7); // 0011 | 0100 == 0111 assert((3 & 4) == 0); // 0011 & 0100 == 0000
更多示例请查看 移位操作符 小节。
数字字面量为编译时常量。很多算术表达式只要其操作数是常量,则表达式结果也是编译时常量。
const msPerSecond = 1000; const secondsUntilRetry = 5; const msUntilRetry = secondsUntilRetry * msPerSecond;
更多内容,请查看 Dart 中的数字。
Strings
Dart 字符串(String
对象)包含了 UTF-16 编码的字符序列。可以使用单引号或者双引号来创建字符串:
var s1 = 'Single quotes work well for string literals.'; var s2 = "Double quotes work just as well."; var s3 = 'It\'s easy to escape the string delimiter.'; var s4 = "It's even easier to use the other delimiter.";
// 代码中文解释
var s1 = '使用单引号创建字符串字面量。';
var s2 = "双引号也可以用于创建字符串字面量。";
var s3 = '使用单引号创建字符串时可以使用斜杠来转义那些与单引号冲突的字符串:\'。';
var s4 = "而在双引号中则不需要使用转义与单引号冲突的字符串:'";
在字符串中,请以 ${
表达式
}
的形式使用表达式,如果表达式是一个标识符,可以省略掉 {}。如果表达式的结果为一个对象,则 Dart 会调用该对象的 toString
方法来获取一个字符串。
var s = 'string interpolation';assert('Dart has $s, which is very handy.' =='Dart has string interpolation, ''which is very handy.'); assert('That deserves all caps. ''${s.toUpperCase()} is very handy!' =='That deserves all caps. ''STRING INTERPOLATION is very handy!');
// 代码中文解释
var s = '字符串插值';assert('Dart 有$s,使用起来非常方便。' == 'Dart 有字符串插值,使用起来非常方便。');
assert('使用${s.substring(3,5)}表达式也非常方便' == '使用插值表达式也非常方便。');
备忘:
==
运算符负责判断两个对象的内容是否一样,如果两个字符串包含一样的字符编码序列,则表示相等。
你可以使用 +
运算符或并列放置多个字符串来连接字符串:
var s1 = 'String ''concatenation'" works even over line breaks."; assert(s1 =='String concatenation works even over ''line breaks.');var s2 = 'The + operator ' + 'works, as well.'; assert(s2 == 'The + operator works, as well.');
// 代码中文解释
var s1 = '可以拼接''字符串'"即便它们不在同一行。";
assert(s1 == '可以拼接字符串即便它们不在同一行。');var s2 = '使用加号 + 运算符' + '也可以达到相同的效果。';
assert(s2 == '使用加号 + 运算符也可以达到相同的效果。');
使用三个单引号或者三个双引号也能创建多行字符串:
var s1 = ''' You can create multi-line strings like this one. ''';var s2 = """This is also a multi-line string.""";
// 代码中文解释
var s1 = '''
你可以像这样创建多行字符串。
''';var s2 = """这也是一个多行字符串。""";
在字符串前加上 r
作为前缀创建 “raw” 字符串(即不会被做任何处理(比如转义)的字符串):
var s = r'In a raw string, not even \n gets special treatment.';
// 代码中文解释
var s = r'在 raw 字符串中,转义字符串 \n 会直接输出 “\n” 而不是转义为换行。';
你可以查阅 Runes 与 grapheme clusters 获取更多关于如何在字符串中表示 Unicode 字符的信息。
字符串字面量是一个编译时常量,只要是编译时常量 (null、数字、字符串、布尔) 都可以作为字符串字面量的插值表达式:
// These work in a const string. const aConstNum = 0; const aConstBool = true; const aConstString = 'a constant string';// These do NOT work in a const string. var aNum = 0; var aBool = true; var aString = 'a string'; const aConstList = [1, 2, 3];const validConstString = '$aConstNum $aConstBool $aConstString'; // const invalidConstString = '$aNum $aBool $aString $aConstList';
可以查阅 字符串和正则表达式 获取更多关于如何使用字符串的信息。
布尔类型
Dart 使用 bool
关键字表示布尔类型,布尔类型只有两个对象 true
和 false
,两者都是编译时常量。
Dart 的类型安全不允许你使用类似 if (nonbooleanValue)
或者 assert (nonbooleanValue)
这样的代码检查布尔值。相反,你应该总是显示地检查布尔值,比如像下面的代码这样:
// Check for an empty string. var fullName = ''; assert(fullName.isEmpty);// Check for zero. var hitPoints = 0; assert(hitPoints <= 0);// Check for null. var unicorn; assert(unicorn == null);// Check for NaN. var iMeantToDoThis = 0 / 0; assert(iMeantToDoThis.isNaN);
Lists
数组 (Array) 是几乎所有编程语言中最常见的集合类型,在 Dart 中数组由 List 对象表示。通常称之为 List。
Dart 中 List 字面量看起来与 JavaScript 中数组字面量一样。下面是一个 Dart List 的示例:
var list = [1, 2, 3];
备忘:
这里 Dart 推断出 list
的类型为 List<int>
,如果往该数组中添加一个非 int 类型的对象则会报错。你可以阅读 类型推断 获取更多相关信息。
你可以在 Dart 的集合类型的最后一个项目后添加逗号。这个尾随逗号并不会影响集合,但它能有效避免「复制粘贴」的错误。
var list = ['Car','Boat','Plane', ];
List 的下标索引从 0 开始,第一个元素的下标为 0,最后一个元素的下标为 list.length - 1
。你可以像 JavaScript 中的用法那样获取 Dart 中 List 的长度以及元素:
var list = [1, 2, 3]; assert(list.length == 3); assert(list[1] == 2);list[1] = 1; assert(list[1] == 1);
在 List 字面量前添加 const
关键字会创建一个编译时常量:
var constantList = const [1, 2, 3]; // constantList[1] = 1; // This line will cause an error.
Dart 在 2.3 引入了 扩展操作符(...
)和 空感知扩展操作符(...?
),它们提供了一种将多个元素插入集合的简洁方法。
例如,你可以使用扩展操作符(...
)将一个 List 中的所有元素插入到另一个 List 中:
var list = [1, 2, 3]; var list2 = [0, ...list]; assert(list2.length == 4);
如果扩展操作符右边可能为 null ,你可以使用 null-aware 扩展操作符(...?
)来避免产生异常:
var list2 = [0, ...?list]; assert(list2.length == 1);
可以查阅扩展操作符建议获取更多关于如何使用扩展操作符的信息。
Dart 还同时引入了 集合中的 if 和 集合中的 for 操作,在构建集合时,可以使用条件判断 (if
) 和循环 (for
)。
下面示例是使用 集合中的 if 来创建一个 List 的示例,它可能包含 3 个或 4 个元素:
var nav = ['Home', 'Furniture', 'Plants', if (promoActive) 'Outlet'];
下面是使用 集合中的 for 将列表中的元素修改后添加到另一个列表中的示例:
var listOfInts = [1, 2, 3]; var listOfStrings = ['#0', for (var i in listOfInts) '#$i']; assert(listOfStrings[1] == '#1');
你可以查阅 集合中使用控制流建议 获取更多关于在集合中使用 if
和 for
的细节内容和示例。
List 类中有许多用于操作 List 的便捷方法,你可以查阅 泛型 和 集合 获取更多与之相关的信息。
Sets
在 Dart 中,set 是一组特定元素的无序集合。 Dart 支持的集合由集合的字面量和 Set 类提供。
版本提示:
尽管 Set 类型(type) 一直都是 Dart 的一项核心功能,但是 Set 字面量(literals) 是在 Dart 2.2 中才加入的。
下面是使用 Set 字面量来创建一个 Set 集合的方法:
var halogens = {'fluorine', 'chlorine', 'bromine', 'iodine', 'astatine'};
备忘:
Dart 推断 halogens
变量是一个 Set<String>
类型的集合,如果往该 Set 中添加类型不正确的对象则会报错。你可以查阅 类型推断 获取更多与之相关的内容。
可以使用在 {}
前加上类型参数的方式创建一个空的 Set,或者将 {}
赋值给一个 Set 类型的变量:
var names = <String>{}; // Set<String> names = {}; // This works, too. // var names = {}; // Creates a map, not a set.
Set 还是 map? Map 字面量语法相似于 Set 字面量语法。因为先有的 Map 字面量语法,所以 {}
默认是 Map
类型。如果忘记在 {}
上注释类型或赋值到一个未声明类型的变量上,那么 Dart 会创建一个类型为 Map<dynamic, dynamic>
的对象。
使用 add()
方法或 addAll()
方法向已存在的 Set 中添加项目:
var elements = <String>{}; elements.add('fluorine'); elements.addAll(halogens);
使用 .length
可以获取 Set 中元素的数量:
var elements = <String>{}; elements.add('fluorine'); elements.addAll(halogens); assert(elements.length == 5);
可以在 Set 变量前添加 const
关键字创建一个 Set 编译时常量:
final constantSet = const {'fluorine','chlorine','bromine','iodine','astatine', }; // constantSet.add('helium'); // This line will cause an error.
从 Dart 2.3 开始,Set 可以像 List 一样支持使用扩展操作符(...
和 ...?
)以及 Collection if
和 for
操作。你可以查阅 List 扩展操作符 和 List 集合操作符 获取更多相关信息。
你也可以查阅 泛型 以及 Set 获取更多相关信息。
Maps
通常来说,Map 是用来关联 keys 和 values 的对象。其中键和值都可以是任何类型的对象。每个 键 只能出现一次但是 值 可以重复出现多次。 Dart 中 Map 提供了 Map 字面量以及 Map 类型两种形式的 Map。
下面是一对使用 Map 字面量创建 Map 的例子:
var gifts = {// Key: Value'first': 'partridge','second': 'turtledoves','fifth': 'golden rings' };var nobleGases = {2: 'helium',10: 'neon',18: 'argon', };
备忘:
Dart 将 gifts
变量的类型推断为 Map<String, String>
,而将 nobleGases
的类型推断为 Map<int, String>
。如果你向这两个 Map 对象中添加不正确的类型值,将导致运行时异常。你可以阅读 类型推断 获取更多相关信息。
你也可以使用 Map 的构造器创建 Map:
var gifts = Map<String, String>(); gifts['first'] = 'partridge'; gifts['second'] = 'turtledoves'; gifts['fifth'] = 'golden rings';var nobleGases = Map<int, String>(); nobleGases[2] = 'helium'; nobleGases[10] = 'neon'; nobleGases[18] = 'argon';
备忘: If you come from a language like C# or Java, you might expect to see new Map()
instead of just Map()
. In Dart, the new
keyword is optional. For details, see Using constructors.
如果你之前是使用的 C# 或 Java 这样的语言,也许你想使用 new Map()
构造 Map 对象。但是在 Dart 中,new
关键词是可选的。(译者注:且不被建议使用) 你可以查阅 构造函数的使用 获取更多相关信息。
向现有的 Map 中添加键值对与 JavaScript 的操作类似:
var gifts = {'first': 'partridge'}; gifts['fourth'] = 'calling birds'; // Add a key-value pair
从一个 Map 中获取一个值的操作也与 JavaScript 类似:
var gifts = {'first': 'partridge'}; assert(gifts['first'] == 'partridge');
如果检索的 Key 不存在于 Map 中则会返回一个 null:
var gifts = {'first': 'partridge'}; assert(gifts['fifth'] == null);
使用 .length
可以获取 Map 中键值对的数量:
var gifts = {'first': 'partridge'}; gifts['fourth'] = 'calling birds'; assert(gifts.length == 2);
在一个 Map 字面量前添加 const
关键字可以创建一个 Map 编译时常量:
final constantMap = const {2: 'helium',10: 'neon',18: 'argon', };// constantMap[2] = 'Helium'; // This line will cause an error.
Map 可以像 List 一样支持使用扩展操作符(...
和 ...?
)以及集合的 if 和 for 操作。你可以查阅 List 扩展操作符 和 List 集合操作符 获取更多相关信息。
你也可以查阅 泛型 以及 Maps API 获取更多相关信息。
Runes 与 grapheme clusters
在 Dart 中,runes 公开了字符串的 Unicode 码位。使用 characters 包 来访问或者操作用户感知的字符,也被称为 Unicode (扩展) grapheme clusters。
Unicode 编码为每一个字母、数字和符号都定义了一个唯一的数值。因为 Dart 中的字符串是一个 UTF-16 的字符序列,所以如果想要表示 32 位的 Unicode 数值则需要一种特殊的语法。
表示 Unicode 字符的常见方式是使用 \uXXXX
,其中 XXXX 是一个四位数的 16 进制数字。例如心形字符(♥)的 Unicode 为 \u2665
。对于不是四位数的 16 进制数字,需要使用大括号将其括起来。例如大笑的 emoji 表情(
Dart 开发语言概览相关推荐
- 二、半天时间掌握Dart开发语言-类的学习
在学习本篇内容之前请先学习一.半天时间掌握Dart开发语言-基础学习_WEB前端李志杰的博客-CSDN博客 掌握Dart开发语言的基础. Dart 是面向对象的编程语言,Dart中类的很多概念跟其他语 ...
- 使用Dart/Flutter语言开发的命令行文字RPG类型小游戏
使用Dart/Flutter语言开发的命令行文字RPG类型小游戏 项目源码:https://gitee.com/FantasyWind/word_game 介绍 项目背景 本项目为使用Dart/Flu ...
- React.js开发生态系统概览 [译-转]
React.js 开发生态系统概览 [译] JavaScript领域发展速度很快,甚至有人认为这已经引起了负效应.一个前端库从早期开发的小玩具,到流行,再到过时,可能也就几个月时间.判断一个工具能否在 ...
- AngularDart 现已全面采用 Dart 开发
一直以来,Angular 2依然采用TypeScript作为主流开发语言,然后自动编译成JavaScript 和 Dart.Dart开发者一直在进行Angular 2拆分,将其分为TypeScript ...
- 开发语言大爆炸的时代,究竟谁主沉浮?
开发语言大爆炸的时代,究竟谁主沉浮? 当这个系列本来打算是写人物的,而且是写我们身边那些优秀的开发者,然而当第一篇文章,写的是关于我们长沙.NET社区的优秀开发者邹琼俊,发表在博客园之后,有一位也是昔 ...
- 移动端开发语言的未来的猜想#华为云·寻找黑马程序员#
[摘要] #华为云.寻找黑马程序员# 不管是最早的Phonegap,还是后来的React Native.Weex,Flutter,或者是各个公司自创开发语言,都是在不断寻求开发语言统一,从而解决ios ...
- 2022编程语言排名, 后端开发语言选型
文章目录 1 2022 编程语言排名 1.1 IEEE Spectrum 2021年度 1.2 TIOBE指数 2022.05 2 后端开发语言选型 2.1 特点概览 2.2 「PHP 是世界上最好的 ...
- Fuchsia 的开发语言政策与解读
我在之前发布过的 <Fuchsia 是什么?Fuchsia OS 的未来如何?> 中介绍过 Fuchsia 的大体情况,也收到了大家对于 Fuchsia OS 褒贬不一的评价,比如: 也有 ...
- 歪批:XCode之外的选择?苹果非主流开发平台概览
/ 附文地址 http://www.cocoachina.com/b/?p=100 此文写的比较早,也许现在已经有很多新的平台或者有很多改进了,反正我看了觉得很有意思,也看到了xcode的强大和优雅, ...
最新文章
- 模板设计模式_设计模式-模板方法模式
- jQuery+css模拟下拉框模糊搜索的实现
- Go 语言web 框架 Gin 练习5
- 设计模式:代理模式是什么,Spring AOP还和它有关系?
- 天池 在线编程 区间统计(队列)
- STM32 DMA详解
- bzoj 1878: [SDOI2009]HH的项链(主席树)
- Android系统默认Home应用程序(Launcher)的启动过程源代码分析(2)
- 利用C++求坐标系中两点间距离
- 一个计算机爱好者的不完整回忆(三十一)我的拼音输入法
- 多平台聚合关键字搜索
- 《京东话费充值系统架构演进实践》阅读笔记
- 科研笔记:可用数据集整理(ing)
- SAP SD初阶之VL10A为销售订单创建外向交货单
- 安卓Apk下载以及静默安装
- android 获取亮度,如何读取Android屏幕亮度/暗淡的实时,当前值?
- 电子工程师必备的调试神器—H7-TOOL
- 真正理解mybatis拦截器以及Interceptor和Plugin作用
- ubuntu18 usb耳机,ubuntu18.04 调试USB声卡
- Android——广播(BroadcastReceiver)