Dart In Action -Dar的基本数据类型(一)

写在前面

本文基本上是将dart官网部分内容进行翻译,没兴趣的请出门左转至Dart的官网,有兴趣的同志请继续阅读本文。 Flutter教程在这里

数字

Dart的数字一共分为2类:

  • int 整型不大于64位,具体取决于平台。 在Dart VM上,值可以是-263到263 - 1.编译为JavaScript的Dart使用JavaScript 数字,允许从-253到253 - 1的值。
  • double 64位(双精度)浮点数,由IEEE 754标准规定。

int和double都是num的子类型。 num类型包括基本运算符,如+, - ,/和*,也是你可以找到abs()ceil()floor()以及其他方法的地方。 (按位运算符,如>>,在int类中有定义。)如果num及其子类没有您要想要内容,那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');

int类型指定传统的按位移位(<<,>>),AND(&)和OR(|)运算符。 例如:

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;

字符串

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

注意:==运算符测试两个对象是否相同。 如果两个字符串包含相同的代码单元序列,则它们是等效的。

您可以使用相邻的字符串文字或+运算符来连接字符串:

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, not even \n gets special treatment.';

有关如何在字符串中表示Unicode字符的详细信息,请参阅Runes。

文字字符串是编译时常量,只要任何插值表达式是一个编译时常量,其值为null或数值,字符串或布尔值。

// 这些在const String可以使用.
const aConstNum = 0;
const aConstBool = true;
const aConstString = 'a constant string';

// 这些在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的类型。 只有两个对象具有bool类型: truefalse,它们都是编译时常量。

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

列表

也许几乎每种编程语言中最常见的集合是数组或有序的对象组。 在Dart中,数组是List 对象,因此大多数人只是将它们称为列表。

Dart列表文字看起来像JavaScript数组文字。 这是一个简单的Dart List:

var list = [1, 2, 3];

注意:分析器推断列表的类型为List <int>。 如果尝试将非整数对象添加到此列表,则分析器或运行时会引发错误。 有关更多信息,请阅读类型推断。 List使用从零开始的索引,其中0是第一个元素的索引,list.length - 1是最后一个元素的索引。 您可以像在JavaScript中一样获取列表的长度并引用列表元素:

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

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

要创建一个编译时常量的列表,请在列表文字之前添加const

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

List类型有许多方便的方法来操作列表。 有关列表的更多信息,请参阅泛型集合

映射

通常,映射是一个有键和值的对象。 键和值都可以是任何类型的对象。 每个键只出现一次,但您可以多次使用相同的值。 Dart的Map支持由映射文字和Map

这里有几个简单的Dart映射,使用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';

注意:您可能希望看到new Map() 而不仅仅是Map()。 从Dart 2开始,new关键字是可选的。 有关详细信息,请参阅使用构造函数。 像在JavaScript中一样,将新的键值对添加到现有Map:

var gifts = {'first': 'partridge'};
gifts['fourth'] = 'calling birds'; // 新增一个键值对

以与在JavaScript中相同的方式从Map中检索值:

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

如果您在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,请在map之前添加const

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

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

有关地图的更多信息,请参阅泛型映射

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏大前端_Web

jsvascript—谜之this?

版权声明:本文为吴孔云博客原创文章,转载请注明出处并带上链接,谢谢。 https://blog.csdn.net/wkyseo/articl...

1584
来自专栏阿凯的Excel

Python读书笔记12(IF语句应用)

今天和大家分享的是所有函数、所有编程的基础,判断! IF语句! IF语句肯定是进行判断,为真怎样,为假如何。 那这个真假就是某个条件是否满足,和Python相...

3709
来自专栏JarvanMo的IT专栏

Dart In Action -Dart快速入门(二)

本文基本上是将dart官网部分内容进行翻译,没兴趣的请出门左转至Dart的官网,有兴趣的同志请继续阅读本文。 Flutter教程在这里

933
来自专栏每日一篇技术文章

Swift3.0 - 流控制

需求二: 输入一个顶点 判断是否在X轴上,或者Y轴上,或者既不在x轴,也不再Y轴上

782
来自专栏我和我大前端的故事

初探 TypeScript函数基本类型泛型接口类内置对象

前段时间有朋友和我推荐 TypeScript ,他说写起来特别爽,让我去试一试,那时候我还在那是啥高深莫测的东西。刚好那段时间忙,一直没有时间看。最近也很忙,还...

4852
来自专栏Golang语言社区

Go语言语法汇总

最近看了看GoLang,把Go语言的语法总结了一下,做个快速参考 数据类型 ---- var varName type,var var1,var2… type,...

4328
来自专栏闪电gogogo的专栏

Python——正则表达式

此篇文章结合小甲鱼的笔记和视频整理。 1 编译 Python 通过 re 模块为正则表达式引擎提供一个接口,同时允许你将正则表达式编译成模式对象,并用它们来进行...

27610
来自专栏LinkedBear的个人空间

唠唠SE的集合-00——概述 原

                        由于是数组实现,在增和删的时候会牵扯到数组增容、以及拷贝元素,所以慢。

892
来自专栏码云1024

JAVA 第二天 内部类

28211
来自专栏Golang语言社区

厚土Go学习笔记 | 11. for循环 go语言只有for循环

Go 只有一种循环结构—— for 循环。 基本的 for 循环包含三个由分号分开的组成部分: 初始化语句:在第一次循环执行前被执行 循环条件表达式:每轮迭代开...

3617

扫码关注云+社区

领取腾讯云代金券