Dart语法学习-数据类型

news2024/11/20 4:54:50

一、Dart 语言对以下类型具有支持

Numbers (int, double)
Strings (String)
Booleans (bool)
Lists (List, also known as arrays)
Sets (Set)
Maps (Map)
Runes (Runes; often replaced by the characters API)
Symbols (Symbol)
The value null (Null)

Dart 要求以 main 函数作为执行的入口。

1.Numbers

Dart 应用程序通常针对多个平台。 例如,Flutter 应用程序可能针对 iOS、Android 和 Web。 代码可以相同,只要应用程序不依赖特定于平台的库或以平台相关的方式使用数字。

Dart 的数值类型 num,只有两种子类:即 64 位 int 和符合 IEEE 754 标准的 64 位 double。前者代表整数类型,而后者则是浮点数的抽象。

除了常见的基本运算符,比如 +、-、*、/,以及位运算符外,你还能使用继承自 num 的 abs()、round() 等方法,来实现求绝对值、取整的功能。

常见的运算符也是继承自 num。

Dart numbers 有两种形式:

int

不大于 64 位的整数值,具体取决于平台。 在本机平台上,值可以从 -2^63到 2^63 - 1。在 Web 上,整数值表示为 JavaScript 数字(没有小数部分的 64 位浮点值)并且可以从 -2^53 到 2^53 - 1。

double

64 位(双精度)浮点数,由 IEEE 754 标准指定。 int 和 double 都是 num 的子类型。 num 类型包括基本运算符,例如 +、-、/ 和 *,您还可以在其中找到 abs()、ceil() 和 floor() 以及其他方法。 (按位运算符,例如 >>,在 int 类中定义。)如果 num 及其子类型没有您要查找的内容,dart:math 库可能有。 整数是没有小数点的数字。 以下是定义整数文字的一些示例:

var x = 1;
var hex = 0xDEADBEEF;

 如果数字包含小数,则为双精度数。 以下是定义双字面量的一些示例:

var y = 1.1;
var exponents = 1.42e5;

您还可以将变量声明为 num。 如果这样做,变量可以同时具有整数和双精度值。

num x = 1; // x can have both int and double values
x += 2.5;

 必要时整数文字会自动转换为双精度数:

double z = 1; // Equivalent to double z = 1.0.

将字符串与数字相互转换的方法

void main() {
  var one = int.parse('1');
  print(one);
  var two = double.parse('2');
  print(two);
  var str = 1.toString();
  print(str);
  var str2 = 3.14159.toStringAsFixed(2);
  print(str2);
}

Log
1
2.0
1
3.14

int 类型指定传统的移位(<<、>>、>>>)、补码(~)、与(&)、或(|)和异或(^)运算符,这些运算符在位运算中对于操作和屏蔽标志很有用。

void main() {
  print((3 << 1) == 6);
  print((3 | 4) == 7);
  print((3 & 4) == 0);
}

Log
true
true
true

文字数字是编译时常量。 许多算术表达式也是编译时常量,只要它们的操作数是计算结果为数字的编译时常量。

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

2.Strings

Dart 的 String 由 UTF-16 的字符串组成。和 JavaScript 一样,构造字符串字面量时既能使用单引号也能使用双引号,还能在字符串中嵌入变量或表达式:你可以使用 ${express} 把一个表达式的值放进字符串。而如果是一个标识符,你可以省略{}。

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} 将表达式的值放入字符串中。如果表达式是标识符(Strings),则可以跳过 {}。 为了获取对象对应的字符串,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!');

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

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

void main() {
  var s1 = 'String '
      'concatenation'
      " works even over line breaks.";
  print(s1 ==
      'String concatenation works even over '
          'line breaks.');

  var s2 = 'The + operator ' + 'works, as well.';
  print(s2 == 'The + operator works, as well.');
}

Log
true
true

 创建多行字符串的方法:使用带有单引号或双引号的三重引号:

void main() {
  var s1 = '''
You can create
multi-line strings like this one.
''';
  print(s1);

  var s2 = """This is also a
multi-line string.""";
  print(s2);
}

Log
This is also a
multi-line string.

 可以通过在其前面加上 r 来创建“raw”字符串

void main() {
  var s = r'In a raw string, not even \n gets special treatment.';
  print(s);
}

Log
In a raw string, not even \n gets special treatment.

 文字字符串是编译时常量,只要任何内插表达式是计算为 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';

 

 

Booleans

为了表示布尔值,Dart 有一个名为 bool 的类型。 只有两个对象具有 bool 类型:布尔文字 true 和 false,它们都是编译时常量。

为了表示布尔值,Dart 使用了一种名为 bool 的类型。在 Dart 里,只有两个对象具有 bool 类型:true 和 false,它们都是编译时常量。

Dart 的类型安全意味着你不能使用像 if (nonbooleanValue) 或 assert (nonbooleanValue) 这样的代码。 相反,显式检查值,如下所示:

void main() {
  // Check for an empty string.
  var fullName = '';
  print(fullName.isEmpty);

// Check for zero.
  var hitPoints = 0;
  print(hitPoints <= 0);

// Check for null.
  var unicorn;
  print(unicorn == null);

// Check for NaN.
  var iMeantToDoThis = 0 / 0;
  print(iMeantToDoThis.isNaN);
}
Log:
true
true
true
true

在 Dart 中的对应实现是 List 和 Map,统称为集合类型。

容器里的元素也需要有类型,比如上述代码中 arr2 的类型是 List<int>,map2 的类型则为 Map<String, String>。Dart 会自动根据上下文进行类型推断,所以你后续往容器内添加的元素也必须遵照这一类型。

如果编译器自动推断的类型不符合预期,我们当然可以在声明时显式地把类型标记出来,不仅可以让代码提示更友好一些,更重要的是可以让静态分析器帮忙检查字面量中的错误,解除类型不匹配带来的安全隐患或是 Bug。

Lists

Dart 列表文字由逗号分隔的表达式或值列表表示,括在方括号 ([]) 中。

void main() {
  var list = [1,2,3];
  print(list);
}

Log:
[1, 2, 3]

注意:Dart 推断列表的类型为 List<int>。 如果您尝试将非整数对象添加到此列表,分析器或运行时会引发错误。

在 Dart 集合文字的最后一项之后添加一个逗号。 这个尾随逗号不会影响集合,但它可以帮助防止复制粘贴错误。

var list = [
  'Car',
  'Boat',
  'Plane',
];

列表使用从零开始的索引,其中 0 是第一个值的索引,list.length - 1 是最后一个值的索引。 您可以使用 .length 属性获取列表的长度,并使用下标运算符 ([]) 访问列表的值:

void main() {
  var list = [1, 2, 3];
  print(list.length == 3);
  print(list[1] == 2);

  list[1] = 1;
  print(list[1] == 1);
}

Log
true
true
true

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

void main() {
  var constantList = const [1, 2, 3];
  print(constantList);
}
[1, 2, 3]

Dart 支持扩展运算符 (...) 和 null 感知扩展运算符 (...?),它们提供了一种将多个值插入集合的简洁方法。

例如,可以使用扩展运算符 (...) 将一个列表的所有值插入到另一个列表中:

void main() {
  var list = [1, 2, 3];
  var list2 = [0, ...list];
  print(list2.length == 4);
  print(list2);
}
Log:
true
[0, 1, 2, 3]

如果展开运算符右侧的表达式可能为空,则可以通过使用可识别空值的展开运算符(...?)来避免异常:

void main() {
  var list = null;
  var list2 = [0, ...?list];
  print(list2.length == 1);
  print(list2);
}

Log
true
[0]

Dart 还提供了 collection if 和 collection for,您可以使用它们来使用条件 (if) 和重复 (for) 构建集合。

下面是一个使用 collection if 来创建包含三个或四个项目的列表的示例:

void main() {
  var promoActive = true;
  var nav = ['Home', 'Furniture', 'Plants', if (promoActive) 'Outlet'];
  print(nav);
}

Log
[Home, Furniture, Plants, Outlet]

这是一个在将列表项添加到另一个列表之前使用 collection for 操作列表项的示例:

void main() {
  var listOfInts = [1, 2, 3];
  var listOfStrings = ['#0', for (var i in listOfInts) '#$i'];
  print(listOfStrings[1] == '#1');
  print(listOfStrings);
}
Log
true
[#0, #1, #2, #3]

Sets

Dart 中的Set是唯一项的无序集合。 Dart 对Set的支持由{}和 Set 类型提供。

这是一个简单的 Dart Set,使用{}创建:

void main() {
  var halogens = {'fluorine', 'chlorine', 'bromine', 'iodine', 'astatine'};
  print(halogens);
}

Log
{fluorine, chlorine, bromine, iodine, astatine}

注意:Dart 推断 halogens 的类型为 Set<String>。 如果您尝试将错误类型的值添加到集合中,分析器或运行时会引发错误。

要创建一个空集,请在 {} 前面加上一个类型参数,或将 {} 分配给 Set 类型的变量:

void main() {
  var names = <String>{};
  print(names.length);
  Set<String> names2 = {}; // This works, too.
  print(names2.length);
  var names3 = {}; // Creates a map, not a set.
  print(names3 is Set);
  print(names3 is Map);
}

Log
0
0
false
true

 注意:Set还是map?  {} 默认为 Map 类型。 如果忘记了 {} 上的类型注释或它分配给的变量,那么 Dart 会创建一个 Map<dynamic, dynamic> 类型的对象。

使用 add() 或 addAll() 方法将项目添加到现有集合:

void main() {
  var halogens = {'fluorine', 'chlorine', 'bromine', 'iodine', 'astatine'};
  var elements = <String>{};
  elements.add("1");
  elements.addAll(halogens);
  print(elements);
}
Log
{1, fluorine, chlorine, bromine, iodine, astatine}

 使用 .length 获取集合中的项目数:

void main() {
  var halogens = {'fluorine', 'chlorine', 'bromine', 'iodine', 'astatine'};
  var elements = <String>{};
  elements.add('fluorine');
  elements.addAll(halogens);
  print(elements.length == 5);
}

Log
true

 要创建一个作为编译时常量的Set,请在Set字面量之前添加 const:

void main() {
  final constantSet = const {
    'fluorine',
    'chlorine',
    'bromine',
    'iodine',
    'astatine',
  };
//此处代码会报错。
  constantSet.add("66");
}

 Set支持扩展运算符(...和...?)和集合 if 和 for,就像List一样。

Maps

通常,Map是关联键和值的对象。 键和值都可以是任何类型的对象。 每个键只出现一次,但您可以多次使用相同的值。 Dart 对地图的支持由地图字面量和 Map 类型提供。

这里有几个简单的 Dart 地图,使用地图字面量创建:

void main() {
  var gifts = {
    // Key:    Value
    'first': 'partridge',
    'second': 'turtledoves',
    'fifth': 'golden rings'
  };
  print(gifts);
  var nobleGases = {
    2: 'helium',
    10: 'neon',
    18: 'argon',
  };
  print(nobleGases);
}

Log
{first: partridge, second: turtledoves, fifth: golden rings}
{2: helium, 10: neon, 18: argon}

 注意:Dart 推断 gifts 具有 Map<String, String> 类型,而 nobleGases 具有 Map<int, String> 类型。 如果您尝试向任一映射添加错误类型的值,则分析器或运行时会引发错误。

使用 Map 构造函数创建相同的对象:


void main() {
  var gifts = Map<String, String>();
  gifts['first'] = 'partridge';
  gifts['second'] = 'turtledoves';
  gifts['fifth'] = 'golden rings';
  print(gifts);

  var nobleGases = Map<int, String>();
  nobleGases[2] = 'helium';
  nobleGases[10] = 'neon';
  nobleGases[18] = 'argon';
  print(nobleGases);
}

Log
{first: partridge, second: turtledoves, fifth: golden rings}
{2: helium, 10: neon, 18: argon}

 注意:在C# 或 Java 等语言,是 new Map() 而不仅仅是 Map()。 在 Dart 中,new 关键字是可选的。

使用下标赋值运算符 ([]=) 将新的键值对添加到现有映射:

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

Log
{first: partridge, fourth: calling birds}

 使用下标运算符 ([]) 从映射中检索值:

void main() {
  var gifts = {'first': 'partridge'};
  print(gifts['first'] == 'partridge');
}
Log:
true

 寻找一个不在Map中的键,你会得到 null 作为回报:

void main() {
  var gifts = {'first': 'partridge'};
  print(gifts['fifth'] == null);
}
Log
true

 使用 .length 获取Map中键值对的数量:

void main() {
  var gifts = {'first': 'partridge'};
  gifts['fourth'] = 'calling birds';
  print(gifts.length == 2);
}
Log
true

 创建作为编译时常量的映射,请在Map字面量之前添加 const:

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

//此处会报错
 constantMap[2] = 'Helium'; // This line will cause an error.
}

 

参考文档:Numbers in Dart | Dart

Language tour | Dart

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/191394.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

正大国际期货:什么是黄金保证金交易?黄金保证金交易包含哪些要点?

黄金保证金交易是指在黄金买卖业务中&#xff0c;市场参与者不需对所交易的黄金进行全额资金划拨&#xff0c;只需按照黄金交易总额支付一定比例的价款&#xff0c;作为黄金实物交收时的履约保证。黄金保证金交易根据类型不同&#xff0c;主要分为期货黄金保证金交易和现货黄金…

visual studio 调试增强,实现一行代码打印调用栈

如何主动打印调用栈&#xff1f;如果是Java、Js&#xff0c;那么很简单&#xff0c;三行就能实现。但 VisualStudio 就复杂多了。如果不下断点&#xff0c;那么只能在崩溃的时候被动查看。 而使用 Backward-Cpp &#xff0c;只需在项目中拖入一个hpp文件&#xff0c;就可以主动…

[Android]ProgressBar进度条

ProgressBar ProgressBar是进度条控件&#xff0c;ProgressBar的应用场景很多&#xff0c;比如用户登录时&#xff0c;后台发送请求&#xff0c;以及进行等待服务器返回信息等一些比较耗时的操作。这个时候如果没有提示&#xff0c;用户可能会以为程序崩溃了或手机死机了&#…

【数据结构】1.2 数据结构的基本概念和术语

文章目录1. 数据、数据元素、数据项和数据对象2. 数据结构逻辑结构的种类存储结构的种类3. 数据类型和抽象数据类型数据类型抽象数据类型概念小结1. 数据、数据元素、数据项和数据对象 数据&#xff08;Data&#xff09; 能输入计算机且能被计算机处理的各种符号的集合。 信息…

AcWing1074. 二叉苹果树(树形DP +分组背包)

AcWing1074. 二叉苹果树&#xff08;树形DP 分组背包&#xff09;一、问题二、分析1、状态表示2、状态转移3、循环设计三、代码一、问题 二、分析 这道题是一个在数上做分组背包问题的模型&#xff0c;那么为什么是分组背包呢&#xff1f;作者在之前的文章中进行过详细地讲解&…

VUE2常用知识

1、Vue的基本原理 【】当一个Vue实例创建时&#xff0c;Vue会遍历data中的属性&#xff0c;用 Object.defineProperty&#xff08;vue3.0使用proxy &#xff09;将它们转为 getter/setter&#xff0c;并且在内部追踪相关依赖&#xff0c;在属性被访问和修改时通知变化。 每个组…

工时管理:按工作时间还是完成的任务来跟踪员工的生产力?

据中国社科院的一项调查显示&#xff1a;我国有86%的职场人都患有拖延症&#xff1b;50%的人不到最后一刻绝不开始工作&#xff1b;13%的人没有人催不能完成工作。 拖延症对小型或成长型企业的影响是很大的&#xff0c;毕竟&#xff0c;任务永远不会因为逃避或简单地坐在那里而…

【Linux】信号保存、信号处理、可重入函数、volatile关键字、SIGCHLD信号

目录 一、信号保存 1.1 信号相关的概念名词 1.2 在内核中的表示 1.3 sigset_t与操作函数 1.4 信号设定 二、信号处理 2.1 内核空间与用户空间 2.2 内核态和用户态 2.3 信号的捕捉流程 2.4 sigaction 函数 三、可重入函数 四、volatile 五、SIGCHLD信号 一、信号保…

当今主流的网络服务应用

文件传输协议 主机之间传输文件是IP网络的一个重要功能&#xff0c;如今人们可以方便地使用网页、邮箱进行文件传输。 然而在互联网早期&#xff0c;Web&#xff08;World Wide Web&#xff0c;万维网&#xff09;还未出现&#xff0c;操作系统使用命令行的时代&#xff0c;…

webpack前端应用之基础打包

目录 前言&#xff1a;初识 Webpack 5 一、前端工程化 1、webpack ​ &#xff08;2&#xff09;主要功能&#xff1a; 2、webpack的使用&#xff1a;配置文件所需要的信息&#xff08;五大配置属性&#xff09; 3、示例 强调&#xff1a; 4、webpack中使用的loader 二…

【Java基础】003 -- Java基础概念(计算机的存储规则)

目录 计算机的存储规则 1、什么是二进制&#xff1f; 2、为什么计算机要使用二进制存储数据&#xff1f; 3、进制之间可以转换吗&#xff1f; 4、码表&#xff08;Text文本&#xff09; 5、图片数据 6、声音数据 计算机的存储规则 在计算机中&#xff0c;任意的数据都是…

java集成RSA非对称加密数据传输

使用场景: 前端请求后端接口时如:登录接口,这时候需要传账号密码到后端接口请求这样就会暴露请求的数据。RSA非对称加密分公钥和私钥,公钥将数据进行加密,私钥对加密的数据进行解密 (当然前端最好是封装一下不要暴露出来公钥) 代码实现: 1、RSA工具类(或访问http:…

大数据舆情监控应用平台,TOOM大数据舆情监控系统的作用

大数据舆情监控应用是利用大数据技术对社会舆情的收集、分析、挖掘和展示的工具。它通常会收集和分析各种社交媒体、新闻媒体、博客等信息&#xff0c;以了解舆情动态和趋势。大数据舆情监控应用可以帮助企业和政府了解市场和社会动态&#xff0c;为决策提供支持。然而&#xf…

聚观早报 |比亚迪预计去年营收超4200亿元;美股三大指数集体收跌

今日要闻&#xff1a;比亚迪预计去年营收超 4200 亿元&#xff1b;美股三大指数集体收跌&#xff1b;王凤英正式加入小鹏汽车出任总裁&#xff1b;苹果计划在印度生产 25% 的 iPhone 手机&#xff1b;LVMH老板放狠话坚决打击代购行为比亚迪预计去年营收超 4200 亿元 1 月 30 日…

(Java高级教程)第四章必备前端基础知识-第三节3:JavaScript之DOM和BOM

文章目录一&#xff1a;WebAPI概述二&#xff1a;DOM&#xff08;1&#xff09;获取元素&#xff08;2&#xff09;事件&#xff08;3&#xff09;操作元素A&#xff1a;获取&#xff08;修改&#xff09;元素内容B&#xff1a;获取&#xff08;修改&#xff09;元素属性C&…

LeetCode 刷题系列 -- 108. 将有序数组转换为二叉搜索树

给你一个整数数组 nums &#xff0c;其中元素已经按 升序 排列&#xff0c;请你将其转换为一棵 高度平衡 二叉搜索树。高度平衡 二叉树是一棵满足「每个节点的左右两个子树的高度差的绝对值不超过 1 」的二叉树。示例 1&#xff1a;输入&#xff1a;nums [-10,-3,0,5,9]输出&a…

粒子群优化(PSO)算法例题实现

目录 一、实验要求 二、算法流程 三、案例实现及结果 完整程序&#xff1a; 一、实验要求 二、算法流程 粒子群算法流程&#xff1a; 1、初始化&#xff1a;初始化粒子群&#xff1b;给每个粒子赋予初始位置和速度 2、计算适应值&#xff1a;根据适应度函数&#xff0c;计…

新范式+新标准=世界级产品|StarRocks年度总结

岁序常易&#xff0c;华章日新。虎年即将落幕&#xff0c;雄关漫道&#xff0c;我们携手社区斗志昂扬&#xff0c;并肩虎跃雄关。兔年新岁将至&#xff0c;黎明破晓&#xff0c;我们协力社区蓄势待发&#xff0c;昂首共赴新程。值此送虎迎兔的新春佳节之际&#xff0c;感恩与St…

电子技术——MOS放大器的DC偏置

电子技术——MOS放大器的DC偏置 正如前几节我们学习的&#xff0c;MOS放大器的小信号模型的参数取决于正确的DC偏置&#xff0c;这个步骤称为偏置设计。一个好的偏置设计要满足一个稳定的漏极DC电流 IDI_DID​ 和设置正确的 VDSV_{DS}VDS​ 保证MOS管在放大信号的时候处在饱和区…

Qt StyleSheet介绍

文章目录前言纠错技巧可以使用 , 号来同时指明多个同一类型控件的样式表qss注释前言 本文主要以这篇博客为基础。添加一些自己使用的心得和使用样式表的一些技巧 纠错 ID选择器这里类型选择器可以省略&#xff0c;因为每个控件的objectName是不一样的&#xff0c;所以无需指定…