Dart之旅02:变量、类型

变量声明

这是一个声明变量的例子:

var name = 'Bob';

这里其实类似kotlin的类型推断,最后编译出来的name是String类型的对象。值为Bob。

如果想像Object那样存储任意类型,那么可以直接使用Object或者dynamic关键字。

当然也可以明确指定变量类型:

String name = 'Bob';

变量默认值

在dart中所有变量的默认值都是null,即使是数字变量。所以数字变量也是需要判空的。

int lineCount;
assert(lineCount == null);

final和const

类似于kotlin,const指定的是一个字面量(编译时常量),而final则是初始化时又一次赋值(运行时常量),之后就再也不能变化的常量。

注意:final类型的变量在初始化时必须进行赋值,这点和java很像,可以在构造函数中赋值。

一个变量被final修饰的话可以省去var关键字:

final name = 'Bob';
final String nickname = 'Bobby';

const通常用来修饰顶层字面量,如果要是在类中则要使用static const,通常可以声明一个数字,字符串,或者一个表达式:

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

const num = T?41:43;

const关键字不仅仅可以用来指定常量,也可以给变量声明为一个常量值比如:

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

这里的const关键字可以省略,就想baz一样。const修饰的东西内容不可以改变,但foo那种则本身是一个变量,可以更改值。

内置类型(Built-in types)

内置类型有以下几个:

  • numbers
  • strings
  • booleans
  • lists(also known as arrays)
  • maps
  • runes(用于在字符串中表达Unicode字符)
  • symbols

它们都是一些对象,有一些有自己的构造方法例如:Map()

int

Integer values no larger than 64 bits, depending on the platform. On the Dart VM, values can be from -2^63 to 2^63 - 1. Dart that’s compiled to JavaScript uses JavaScript numbers, allowing values from -2^53 to 2^53 - 1.

double

double遵循IEEE 754标准,也是64位的。

int和double都是num类型的子类。num类型重载了加减乘除运算符,也包含绝对值abs(),向上向下取整的运算ceilfloor
移位运算符则在int中重载。更多的数字运算则在dart:math库中存在。

字符串和数字之间的转换
// 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');
位运算

这个其实不太常用姑且记下:
The int type specifies the traditional bitwise shift (<<, >>), AND (&), and OR (|) operators. For example:

assert((3 << 1) == 6); // 0011 << 1 == 0110
assert((3 >> 1) == 1); // 0011 >> 1 == 0001
assert((3 | 4) == 7); // 0011 | 0100 == 0111
字符串

dart的字符串是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.";
字符串模板

字符串模板与kotlin和php的一样,这里不加赘述了。但在dart中==运算比较的是字符串的内容,这点和kotlin是一样的。字符串拼接也是加号。

多行字符串

这有点类似于kotlin,或者<pre>:

var s1 = '''
You can create
multi-line strings like this one.
''';

var s2 = """This is also a
multi-line string.""";

dart中比较好的一点是,如果你想打印raw字符串,则可以加上r表示:

var s = r'In a raw string, not even \n gets special treatment.';

字符串字面量是一个编译时常量,可以赋值在const上,这点和kotlin一样的:

// 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';
Lists

或许大多数的语言中最常用的是数组,但dart中它是一个List对象下面是一个简单的dart list:

var list = [1,2,3];

这里的list变量会被分析为List<int>类型,如果你试图将一个非整形的值放入其中,就会产生异常。
List和数组一样,也是从零开始的。
List的用法和java的数组很像,但其实它就是一个对象。List有很多方便的工具方法。这里在后续章节中详述

Maps

Map和Java以及大多数语言的定义一样,都是只有一个唯一的key,这个key指定一个value。dart支持map字面量和Map类型:

var gifts = {
  // Key:    Value
  'first': 'partridge',
  'second': 'turtledoves',
  'fifth': 'golden rings'
};

var nobleGases = {
  2: 'helium',
  10: 'neon',
  18: 'argon',
};

这里词法分析器会断定gifts是一个Map<String, String>类型,而nobleGases是一个Map<int, String>,如果你试图添加错误的类型,就会报错。

你可以使用Map构造器来创建:

var gifts = Map();
gifts['first'] = 'partridge';
gifts['second'] = 'turtledoves';
gifts['fifth'] = 'golden rings';

var nobleGases = Map();
nobleGases[2] = 'helium';
nobleGases[10] = 'neon';
nobleGases[18] = 'argon';

如果获取一个不存在的key的值,那么就会返回null。

var gifts = {'first': 'partridge'};
assert(gifts['fifth'] == null);

length属性指代键值对的数量。

var gifts = {'first': 'partridge'};
gifts['fourth'] = 'calling birds';
assert(gifts.length == 2);

一个map可以是一个字面量:

final constantMap = const {
  2: 'helium',
  10: 'neon',
  18: 'argon',
};
Runes

在dart中Runes是一个UTF-32编码的字符串。Unicode定义了一个数字化的值给一个字符,但UTF-16定一个的字符串还是有限的,String要是想表达UTF-32的字符就需要一些特殊的语法。

通常的表达Unicode的方法是\uXXXX,XXXX是一个四位的十六进制,例如(♥) is \u2665,如果要表达多于或者少于4个16进制数的时候就要使用一个大括号,例如:(😆) is \u{1f600}.

String类又一些方法可以转换成Runes类型。codeUnits属性可以获取字符位数组。runes属性则可以生成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));
}

output:

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

推荐阅读更多精彩内容