Dart —— 基础数据类型 Number String Boolean List Map Set Rune Symbol_dart number-程序员宅基地

技术标签: 基础数据类型  dart  # Dart语法与内部原理  内建类型  数据类型  

Dart汇总请点击这里

内建类型

Dart 语言支持以下内建类型:

  • Number
  • String
  • Boolean
  • List (也被称为 Array)
  • Map
  • Set
  • Rune (用于在字符串中表示 Unicode 字符)
  • Symbol

这些类型都可以被初始化为字面量。 例如, 'this is a string'是一个字符串的字面量, true 是一个布尔的字面量。

因为在 Dart 所有的变量终究是一个对象(一个类的实例), 所以变量可以使用 构造函数 进行初始化。 一些内建类型拥有自己的构造函数。 例如, 通过 Map() 来构造一个 map 变量。

Number

Dart 语言的 Number 有两种类型:

  • int
    整数值不大于64位, 具体取决于平台。

    • 在 Dart VM 上, 值的范围从 -2 ^ 63 到 2 ^ 63 - 1.
    • Dart 被编译为 JavaScript 时,使用 JavaScript numbers, 值的范围从 -2 ^ 53 到 2 ^ 53 - 1.
  • double
    64位(双精度)浮点数,依据 IEEE 754 标准。

intdouble 都是 num的子类。 num 类型包括基本运算 +, -, /, 和 *, 以及 abs()ceil(), 和 floor(), 等函数方法。 (按位运算符,例如»,定义在 int 类中。) 如果 num 及子类找不到你想要的方法, 尝试查找使用 dart:math 库。

整数类型不包含小数点。 下面是定义整数类型边量的例子:

var x = 1;
var hex = 0xDEADBEEF;

如果一个数字包含小数点,那么就是小数类型。 下面是定义小数类型字面量的例子:

var y = 1.1;
var exponents = 1.42e5;

从 Dart 2.1 开始,必要的时候 int 字面量会自动转换成 double 类型。

double z = 1; // 相当于 double z = 1.0.

版本提示: 在 2.1 之前,在 double 上下文中使用 int 字面量是错误的。

以下是将字符串转换为数字的方法,反之亦然:

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

int 特有的传统按位运算操作,移位(<<, >>),按位与(&)以及 按位或(|)。 例如:

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

数字类型字面量是编译时常量。 在算术表达式中,只要参与计算的因子是编译时常量, 那么算术表达式的结果也是编译时常量。

const msPerSecond = 1000;
const secondsUntilRetry = 5;
const msUntilRetry = secondsUntilRetry * msPerSecond;

String

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.";

字符串可以通过${expression} 的方式内嵌表达式。 如果表达式是一个标识符,则 {} 可以省略。 在 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!');

提示: == 运算符用来测试两个对象是否相等。 在字符串中,如果两个字符串包含了相同的编码序列,那么这两个字符串相等。 units.

可以使用 + 运算符来把多个字符串连接为一个,也可以把多个字面量字符串写在一起来实现字符串连接:

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 = '''
You can create
multi-line strings like this one.
''';


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

使用 r 前缀,可以创建 “原始 raw” 字符串:

var s = r"In a raw string, even \n isn't special.";

参考 Runes 来了解如何在字符串中表达 Unicode 字符。

一个编译时常量的字面量字符串中,如果存在插值表达式,表达式内容也是编译时常量, 那么该字符串依旧是编译时常量。 插入的常量值类型可以是 null,数值,字符串或布尔值。

// const 类型数据
const aConstNum = 0;
const aConstBool = true;
const aConstString = 'a constant string';

// 非 const 类型数据
var aNum = 0;
var aBool = true;
var aString = 'a string';
const aConstList = [1, 2, 3];

const validConstString = '$aConstNum $aConstBool $aConstString'; //const 类型数据
// const invalidConstString = '$aNum $aBool $aString $aConstList'; //非 const 类型数据

更多关于 string 的使用, 参考 字符串和正则表达式.

Boolean

Dart 使用 bool 类型表示布尔值。 Dart 只有字面量 trueand false 是布尔类型, 这两个对象都是编译时常量。

Dart 的类型安全意味着不能使用if (nonbooleanValue)或者 assert (nonbooleanValue)。 而是应该像下面这样,明确的进行值检查:

// 检查空字符串。
var fullName = '';
assert(fullName.isEmpty);

// 检查 0 值。
var hitPoints = 0;
assert(hitPoints <= 0);

// 检查 null 值。
var unicorn;
assert(unicorn == null);

// 检查 NaN 。
var iMeantToDoThis = 0 / 0;
assert(iMeantToDoThis.isNaN);

List

几乎每种编程语言中最常见的集合可能是 array 或有序的对象集合。 在 Dart 中的 Array 就是 List 对象, 通常称之为 List 。

Dart 中的 List 字面量非常像 JavaScript 中的 array 字面量。 下面是一个 Dart List 的示例:

var list = [1, 2, 3];

提示: Dart 推断 list 的类型为 List 。 如果尝试将非整数对象添加到此 List 中, 则分析器或运行时会引发错误。 有关更多信息,请阅读 类型推断

Lists 的下标索引从 0 开始,第一个元素的索引是 0。 list.length - 1 是最后一个元素的索引。 访问 List 的长度和元素与 JavaScript 中的用法一样:

var list = [1, 2, 3];
assert(list.length == 3);
assert(list[1] == 2);

list[1] = 1;
assert(list[1] == 1);

在 List 字面量之前添加 const 关键字,可以定义 List 类型的编译时常量:

var constantList = const [1, 2, 3];
// constantList[1] = 1; // 取消注释会引起错误。

List的一些常用API

var list = [1, 2, 3];
assert(list[1] == 2);

list.add(value);
list.addAll(iterable);
list.insert(index, element);
list.insertAll(index, iterable);

list.remove(2);
list.removeAt(1);
list.removeRange(0, 5);
list.removeLast();
list.clear();

list.indexOf(element);
list.lastIndexOf(element);

list.removeWhere((item) => item > 3);
list.sort((a, b) => a.compareTo(b));
var l = list.reversed;
list.isNotEmpty;
list.isEmpty;
list.length;

Set

在 Dart 中 Set 是一个元素唯一且无需的集合。 Dart 为 Set 提供了 Set 字面量和 Set 类型。

版本提示: 虽然 Set 类型 一直是 Dart 的核心部分, 但在 Dart2.2 中才引入了 Set 字面量 。

下面是通过字面量创建 Set 的一个简单示例:

var halogens = {
    'fluorine', 'chlorine', 'bromine', 'iodine', 'astatine'};

Note: Dart 推断 halogens 类型为 Set< String > 。如果尝试为它添加一个 错误类型的值,分析器或执行时会抛出错误。更多内容,参阅 类型推断

要创建一个空集,使用前面带有类型参数的{},或者将{}赋值给 Set 类型的变量:

var names = <String>{
    };
// Set<String> names = {}; // 这样也是可以的。
// var names = {}; // 这样会创建一个 Map ,而不是 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'); // Uncommenting this causes an error.

Set的一些常用API

var set = Set();
set.add(value);
set.addAll(elements);
set.remove(value);
set.removeAll(elements);
set.removeWhere((item)=>item>3);
set.contains(value);
set.containsAll(other);
set.isNotEmpty;
set.isEmpty;
set.length;
set.difference(other);//返回一个新集合,该集合的元素不在[other]中。
set.intersection(other);//返回一个新的集合,这个集合是这个集合和其他集合的交集。
set.union(other);//返回一个新的集合,其中包含这个集合和[其他]的所有元素。

Map

通常来说, Map 是用来关联 keys 和 values 的对象。 keys 和 values 可以是任何类型的对象。在一个 Map 对象中一个 key 只能出现一次。 但是 value 可以出现多次。 Dart 中 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();
gifts['first'] = 'partridge';
gifts['second'] = 'turtledoves';
gifts['fifth'] = 'golden rings';

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

提示: 这里为什么只有 Map() ,而不是使用 new Map()。 因为在 Dart 2 中,new 关键字是可选的。 有关更多信息,参考 构造函数的使用。

类似 JavaScript ,添加 key-value 对到已有的 Map 中:

var gifts = {
    'first': 'partridge'};
gifts['fourth'] = 'calling birds'; // Add a key-value pair

类似 JavaScript ,从一个 Map 中获取一个 value:

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

如果 Map 中不包含所要查找的 key,那么 Map 返回 null:

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

使用 .length 函数获取当前 Map 中的 key-value 对数量:

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

创建 Map 类型运行时常量,要在 Map 字面量前加上关键字 const。

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

// constantMap[2] = 'Helium'; // 取消注释会引起错误。

Map 常用API

var map = {
    'first': 'partridge'};
map['fourth'] = 'calling birds';
map.remove(key);
map.addAll(other);
map.addEntries(newEntries);
map.putIfAbsent(key, ifAbsent);//查找[key]的值,如果没有,则添加一个新值。
map.remove(key);
map.removeWhere((key,value)=>{
    });
map.clear();
map.containsKey(key);
map.containsValue(value);
map.length;
map.isNotEmpty;
map.isEmpty;


Rune

在 Dart 中, Rune 用来表示字符串中的 UTF-32 编码字符。

Unicode 定义了一个全球的书写系统编码, 系统中使用的所有字母,数字和符号都对应唯一的数值编码。 由于 Dart 字符串是一系列 UTF-16 编码单元, 因此要在字符串中表示32位 Unicode 值需要特殊语法支持。

表示 Unicode 编码的常用方法是,\uXXXX, 这里 XXXX 是一个4位的16进制数。 例如,心形符号 () 是 \u2665。 对于特殊的非 4 个数值的情况, 把编码值放到大括号中即可。 例如,emoji 的笑脸 (�) 是\u{1f600}

String 类有一些属性可以获得 rune 数据。 属性 codeUnitAtcodeUnit 返回16位编码数据。 属性runes 获取字符串中的 Rune 。

下面是示例演示了 Rune 、 16-bit code units、 和 32-bit code points 之间的关系。

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));
}


[55357, 56399]
[128079]

提示: 谨慎使用 list 方式操作 Rune 。 这种方法很容易引发崩溃, 具体原因取决于特定的语言,字符集和操作。 有关更多信息,参考How do I reverse a String in Dart? on Stack Overflow.

Symbol

一个 Symbol 对象表示 Dart 程序中声明的运算符或者标识符。 你也许永远都不需要使用 Symbol ,但要按名称引用标识符的 API 时, Symbol 就非常有用了。 因为代码压缩后会改变标识符的名称,但不会改变标识符的符号。 通过字面量 Symbol ,也就是标识符前面添加一个 # 号,来获取标识符的 Symbol 。

#radix
#bar

Symbol 字面量是编译时常量。
Symbol 详细请参阅:Dart 反射

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/rd_w_csdn/article/details/103404564

智能推荐

用BERT做命名实体识别任务-程序员宅基地

文章浏览阅读1.3k次。命名实体识别NER任务是NLP的一个常见任务,它是Named Entity Recognization的简称。简单地说,就是识别一个句子中的各种 名称实体。诸如:人名,地名,机构 等。例如对于下面这句话:小明对小红说:"你听说过安利吗?"它的NER抽取结果如下:[{'entity':'person','word':'小明','start':0,'end':2},{'e..._bert命名实体识别

node.js+Vue计算机毕设项目勤工助学管理系统(程序+LW+部署)_基于vue node勤工助学管理系统-程序员宅基地

文章浏览阅读150次。该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程。欢迎交流项目运行环境配置:项目技术:Express框架 + Node.js+ Vue 等等组成,B/S模式 +Vscode管理+前后端分离等等。环境需要1.运行环境:最好是Nodejs最新版,我们在这个版本上开发的。其他版本理论上也可以。2.开发环境:Vscode或HbuilderX都可以。推荐HbuilderX;3.mysql环境:建议是用5.7版本均可。_基于vue node勤工助学管理系统

【深度学习项目】基于FER-2013数据集的人脸表情识别代码实现-程序员宅基地

文章浏览阅读369次,点赞6次,收藏6次。本人的深度学习课程大作业。基于FER-2013数据集的人脸表情识别代码实现。3万多字的文字说明,从零开始训练自己的模型。包含FER-2013数据集下载资源、完整可运行代码文件、训练好的模型文件。

python 括号 垃圾_Python 为什么抛弃累赘的花括号,使用缩进来划分代码块?-程序员宅基地

文章浏览阅读199次。大家好,这是“Python为什么”系列节目的文字稿(文末有观看地址)。本期话题:Python 为什么使用缩进来划分代码块,而不像其它语言使用花括号 {} 或者 “end” 之类的语法?Python 的缩进是一个老生常谈的话题,经常有人会提及它,比如 Python 之父在上个月就恰好转发过一篇文章:image因为这篇文章,Guido 还受邀在 Python Bytes 播客上录制了一期节目:imag..._python为什么抛弃大括号

国王给骑士金币c 语言编程,noip2015年全国青少年信息学奥林匹克竞赛决赛(普及组)01 金币...-程序员宅基地

文章浏览阅读1.2k次。【noip2015年全国青少年信息学奥林匹克竞赛决赛(普及组)】01:金币【题目描述】国王将金币作为工资,发放给忠诚的骑士。第一天,骑士收到一枚金币;之后两天(第二天和第三天),每天收到两枚金币;之后三天(第四、五、六天),每天收到三枚金币;之后四天(第七、八、九、十天),每天收到四枚金币……;这种工资发放模式会一直这样延续下去:当连续N天每天收到N枚金币后,骑士会在之后的连续N+1天里,每天收到...

Python之ruamel.yaml模块详解(二)-程序员宅基地

文章浏览阅读733次。【代码】Python之ruamel.yaml模块详解(二)_ruamel.yaml

随便推点

You have not concluded your merge (MERGE_HEAD exists) git拉取失败_如何处理visual studio code中 you have not concluded you-程序员宅基地

文章浏览阅读323次。You have not concluded your merge (MERGE_HEAD exists) git拉取失败今天获取git线上仓库代码报了这个错误:zhangzhi@moke:~/code/ktsg-api$ git pullYou have not concluded your merge (MERGE_HEAD exists).Please, commit your chan..._如何处理visual studio code中 you have not concluded your merge

office365 微软Microsoft teams 卸载/自动安装问题_teamsmachine-程序员宅基地

文章浏览阅读1.8w次,点赞8次,收藏5次。安装使用office365后发现了一个问题,那就是多出来的teams又没用又老是卸载不掉,重启后马上自动安装,非常烦人。 完全卸载步骤如下方法1:可通过在Windows开始右击卸载卸载,一定要卸载teams和teams machine-wide installer两个程序方法2:在任务管理器关闭teams名字的任务后,通过文件管理器删除卸..._teamsmachine

leaflet中添加天地图影像,矢量图层切换样式调整_leaflet矢量图 影像图切换-程序员宅基地

文章浏览阅读2k次。1. 效果如下图:2. 代码如下:添加天地图详细过程请看:https://blog.csdn.net/qq_34790644/article/details/86535456const layers = { baseLayers:{ [getImageTitle(`../../../risk/assets/images/1.png`, 35)]: vecGroup, //影像图 [getImageTitle(`../../../risk/asset._leaflet矢量图 影像图切换

四位数码管树莓派c语言,用树莓派和四位数码管模块做一个时钟-程序员宅基地

文章浏览阅读638次。8种机械键盘轴体对比本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选?预备知识如图,这是一个4位数码管模块,由两片 74HC595 级联控制,引脚如图,从上到下,分别为VCC(3.3V/5V),SCLK(移位控制端),RCLK(输出控制端),DIO(数据输入端),GND(接地)。74HC595我们来看一下74HC595是什么样的看懂这个芯片需要一点点的数字电子技术的知识,看下面这个表格符号..._4位数码管时钟c语言程序

matlab输出二进制,Matlab:如何将实数表示为二进制-程序员宅基地

文章浏览阅读1.4k次。你当然可以在实数空间中计算它,但是你有可能遇到精度问题(取决于起点).如果您对研究轨道感兴趣,您可能更愿意使用合理的分数表示法.有更有效的方法可以做到这一点,但下面的代码说明了一种计算从该映射派生的系列的方法.您将在Link 2的第2页上看到period-n定义.您应该能够从此代码中看到如何在实数空间中轻松地工作作为替代(在这种情况下,matlab函数鼠将恢复从你的真实数字的理性近似).[编辑]现..._matlab将输出样本变为二进制的方法

vivado时序约束_vivado logic level-程序员宅基地

文章浏览阅读2.7k次,点赞5次,收藏43次。vivado时序约束_vivado logic level

推荐文章

热门文章

相关标签