核心内容
- 最基础的Dart程序
- Dart一些重要的概念
- KeyWord(关键字)
- Variable(变量)
- Final&&Const
- Dart的内置类型
最基础的Dart程序
先看一个最基础的Dart程序
void log(Object object) {
print(object.toString());
}
/// Returns a Boolean representation for [arg], which must
/// be a String or bool.
bool convertToBool(dynamic arg) {
if (arg is bool) return arg;
if (arg is String) return arg == 'true';
throw ArgumentError('Cannot convert $arg to a bool.');
}
上面的代码写出了Dart最基本的一些特性。
以下的东西基本会出现在所有的Dart程序中
int
一种类型。其他一些内建类型还有是Sting, list,和bool等
42
数字,一个编译时的常数.
print()
显示输出的print方法。
‘…’(或"…")
字符串文本
$variableName或${表达方式}
字符串插值:在字符串文本中包含一个变量或表达式的字符串等效的字符串。
main()
应用程序执行开始的顶级方法
var
一种在不指定变量类型的情况下声明变量的方法。
Dart一些重要的概念
(1)与Java不同,Dart没有公开、受保护和私有的关键字。如果标识符以下划线(_)开头,则它对其库是私有的。
(2)标识符可以字母或下划线(_)开头,后面跟着这些字符的任何组合加上数字
(3)DART工具可以报告两种问题:警告和错误。警告只是表明您的代码可能无法工作,但它们并不妨碍您的程序执行。错误可以是编译时,也可以是运行时。编译时错误完全阻止代码执行;运行时错误导致在执行代码时引发异常。
(4)DART有表达式(有运行时值)和语句(没有)。例如,条件表达式条件?expr1:expr2的值为expr1或expr2。将其与没有值的if-etc语句进行比较。语句通常包含一个或多个表达式,但表达式不能直接包含语句。
(5)虽然DART是强类型的,但类型注释是可选的,因为DART可以推断类型。在上面的代码中,number推断为类型INT。当您想明确表示不需要任何类型时,使用特殊类型dynamic.
(6)DAT支持泛型类型,如List(整数列表)或List(任何类型的物体的清单)。
(7)DART支持顶级函数(如main()),以及绑定到类或对象的函数(静态和实例方法分别)。您还可以在函数中创建函数(巢式或局部函数).
‘…’(或"…")表示字符串文字
KeyWord(关键字)
避免使用这些词作为标识符。但是,如果有必要,标记上标的关键字可以是标识符,但是表中的其他单词是保留字不能作为是标识符:
- 上标词1是语境关键词,只有在特定的地方才有意义。到处都是有效的标识符。
- 上标词2是内置标识符。为了简化将JavaScript代码移植到DART的任务,这些关键字在大多数地方都是有效的标识符,但它们不能用作类名或类型名称,也不能用作导入前缀。
- 上标词3是与异步支持这是在Dart的1.0版本之后添加的。你不能用await或yield作为标识符,在任何被标记为async, async*,或sync*.
。
Variable(变量)
创建变量有三种方式
String name = 'Bob';
var name = 'Bob';
dynamic name = 'Bob';
(1)String很简单,就是显式声明变量类型是String类型
(2)var表示name变量可以根据值(‘Bob’)从而推断出它的类型(String)
(3)如果对象不限于单个类型,就使用dynamic关键字,指定对象为dynamic类型
对于局部变量,这里按代码风格推荐部分的建议,使用 var 而不是具体的类型来定义局部变量
变量的默认值
比如语句:
int a;
那么它的默认值就是null,并不是0。
int类型的变量和Dart中的其他所有一切都是对象
Final&&Const
Final变量必须要给个初始值,并且给定后,就不能再次赋值给该变量
final name = 'Bob'; // Without a type annotation
final String nickname = 'Bobby';
再次赋值会报错
name = 'Alice'; // Error: a final variable can only be set once.
Const变量是编译时常量.(Const变量是隐式最终变量。)第一次使用时,将初始化最后一个顶级变量或类变量。
如果const变量位于类级别,则标记它为static const
const bar = 1000000; // Unit of pressure (dynes/cm2)
const double atm = 1.01325 * bar; // Standard atmosphere
不仅用于声明常量变量。您也可以使用它来创建常量值,以及声明构造函数创造常数值任何变量都可以有一个常量值。
var foo = const [];
final bar = const [];
const baz = []; // 等同于const []
注意:可以省略常量的初始化表达式常量声明
可以改变不是final、const修饰的变量,即使它被赋值过const常量
例如修改上述的var foo
foo = [1, 2, 3]; // Was const []
不能改变一个const常量的值,例如修改上述的const baz,就会报错
baz = [42]; // Error: Constant variables can't be assigned a value.
内置类型
DART语言支持以下数据类型
- numbers
- strings
- booleans
- lists (also known as arrays)
- maps
- runes (for expressing Unicode characters in a string)
- symbols
(一)numbers
Dart的numbers有两种形式
一个是int,它的整数值不大于64位,具体范围取决于平台。在dart vm上,值可以是
-2^63 至 2^63-1 。编译为JavaScript的DART使用JavaScript数字允许-2^53 至2^53-1
另一个是double。64位双精度浮点数,由IEEE 754标准指定
int和double支持基本的加减乘除运算,也可以找到abs()、ceil()和floor()其他方法。如果一些方法在int和double类里面没有找到,那么在dart::math库里面或许可以找到
int x = 1;
int hex = 0xDEADBEEF;
double y = 1.1;
double exponents = 1.42e5;
字符串转数字的方法
// 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');
(二)String
DART字符串是一个UTF-16码单元的序列.可以使用单引号或双引号创建字符串:
var s1 = 'Single quotes work well for string literals.';
var s2 = "Double quotes work just as well.";
可以将表达式的值放入字符串中,方法是${表达}。如果表达式是标识符,则可以跳过{}。要获取与对象对应的字符串,DAT调用对象的字符串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 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.');
注意:文字字符串要求是编译时常量,只要任何内插表达式是编译时常量,比如说结果是为NULL或数值或字符串或布尔值。
//这些是可以内嵌到字符串中的
const aConstNum = 0;
const aConstBool = true;
const aConstString = 'a constant 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';
提供一个 r 前缀可以创建一个 “原始 raw” 字符串
var s = r"In a raw string, even \n isn't special."; //加上r 可以防止\n换行
使用三个单引号或者双引号也可以 创建多行字符串对象
var s1 = '''a
You can create
multi-line strings like this one.
''';
输出s1结果是
a
You can create
multi-line strings like this one.
(三)Booleans
为了表达布尔值,Dart把类型命名为bool,有两种类型值,true和false,他们都是编译时常量。
当 Dart 需要一个布尔值的时候,只有 true 对象才被认为是 true。 所有其他的值都是 false。这点和 JavaScript 不一样, 像 1、 “aString”、 以及 someObject 等值都被认为是 false。
例如
// 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);
var name = 'Bob';
if (name) { //name被转换成bool类型,默认是false
// Prints in JavaScript, not in Dart.
print('You have a name!');
}
如果在 JavaScript 中运行,则会打印出 “You have a name!”,在 JavaScript 中 name 是非 null 对象所以认为是 true。但是在 Dart 的生产模式下 运行,这不会打印任何内容,原因是 name 被转换为 false了,原因在于 name != true。 如果在 Dart 检查模式运行,上面的 代码将会抛出一个异常,表示 name 变量不是一个布尔值。
(四)List
大多数编程语言中的集合都是数据或者对象组。在dart里面数组就是list对象
Dart list就像JavaScript数组文本。下面是Dart的一个简单list
var list = [1, 2, 3];
分析器推断list有型List。如果尝试向此列表添加非整数对象,分析器或运行时将引发错误。list的索引从0开始,即0是第一个元素的索引
list[1] = 1;
assert(list[1] == 1);
List类型支持很多操作list的方法,不可以像数组赋值那样直接对元素赋值
var constantList = const [1, 2, 3];
// constantList[1] = 1; // Uncommenting this causes an error.
(五)Map
可以使用Map构造方法创建对象
var gifts = Map();
gifts['first'] = 'partridge';
gifts['second'] = 'turtledoves';
gifts['fifth'] = 'golden rings';
我们发现没有new Map(),在Dart 2里new关键字是可选的。
向现有的映射中添加元素
var gifts = {'first': 'partridge'};
gifts['fourth'] = 'calling birds'; // Add a key-value pair
从映射中查询值
var gifts = {'first': 'partridge'};
assert(gifts['first'] == 'partridge');
要获取映射中键值对的数目,使用.length
var gifts = {'first': 'partridge'};
gifts['fourth'] = 'calling birds';
assert(gifts.length == 2);
获取键值对的值
//Map的用法
final constantMap = const {
2: 'helium',
10: 'neon',
18: 'argon',
};
print(constantMap[11]); //打印为null
print(constantMap[10]); //打印 neon
print(constantMap.length); //打印 3
(六)Runes
在DART中,runes表示字符串的UTF-32编码
Unicode为所有世界上的书写系统中使用的每个字母、数字和符号定义一个唯一的数字值。由于DART字符串是由UTF-16代码单元组成的序列,因此在字符串中表示32位Unicode值需要特殊的语法。
通常表示Unicode代码点的方法是\uXXXX,其中XXXX是一个4位的十六进制值。例如,爱心字符(♥)是\u2665。
String类具有几个可用于提取符文信息的属性,codeUnitAt和codeUnit属性返回16位代码单元。使用runes属性获取字符串的符文。
例如
main() {
var clapping = '\u{1f44f}';
print(clapping);
print(clapping.codeUnits);
print(clapping.runes.toList());
Runes input = new Runes(
'\u2665 \u{1f605} \u{1f60e} \u{1f47b} \u{1f596} \u{1f44d}');
print(new String.fromCharCodes(input));
}
运行结果是这样
(七)Symbols
Symbol对象表示在Dart程序中声明的运算符或标识符。您可能永远不需要使用符号,但它们对于按名称引用标识符的API非常有用,因为缩小会更改标识符名称而不会更改标识符符号。要获取标识符的符号,请使用符号文字,它只是#后跟标识符:
#radix
#bar
这个很不常用,就暂时忽略吧…
这里的很多内容都只是大概介绍个基础点,里面的每个部分都还有很多知识点细节需要学习,在之后的系列会慢慢展开来说。
漫漫人生路,偶尔还是要喝点有营养的鸡汤的
人生都是走着走着就开阔了,现在的你,不用着急。让未来的,本该属于你的树再长长,那些花再开开,等你遇见的时候,才是他们最美的时候。
|
请发表评论