【Dart语言解密】想要深入了解Dart语法和类型变量吗?

news2024/12/22 20:22:32

快来读读这篇文章吧!本文从Dart信息表示的角度出发,详细讲解了Dart的基础语法和类型变量。通过本文的学习,你将会对Dart语言有更深入的认识和理解,更好地掌握Dart的开发技巧和实践应用。快来一起解密Dart语言吧!

1 Dart hello world示例

新建main.dart,声明一个带int参数的函数,并通过字符串内嵌表达式的方式把这个参数打印:

printInteger(int a) {
  print('Hello world, this is $a.');
}

main() {
  var number = 2019;
  printInteger(number);
}

输出:

Hello world, this is 2019.

Dart也要求main作执行入口。

2 Dart的变量与类型

可用var或具体类型声明一个变量:

  • 使用var定义变量时,表示类型交由编译器推定
  • 也可用静态类型去定义变量,更清楚和编译器表达意图,这样编辑器和编译器就能使用这些静态类型,向你提供代码补全或编译警告提示

默认,未初始化的变量值都是null,因此不用担心无法判定一个传递过来的、未定义变量到底是undefined,还是烫烫烫而写一堆判断语句。

Dart是类型安全的语言,并且所有类型都是对象类型,都继承自顶层类型Object,因此一切变量值都是类的实例(即对象),数字、布尔值、函数和null也都是继承自Object的对象。

Dart内置基本类型,如 num、bool、String、List和Map,在不引入其他库时可以使用它们声明变量。

2.1 num、bool与String

作为编程语言中最常用的类型,num、bool、String这三种基本类型被我放到了一起来介绍。

Dart的数值类型num,只有两种子类:即64位int和符合IEEE 754标准的64位double。前者代表整数类型,而后者则是浮点数的抽象。在正常情况下,它们的精度与取值范围就足够满足我们的诉求了。

int x = 1;
int hex = 0xEEADBEEF;
double y = 1.1;
double exponents = 1.13e5;
int roundY = y.round();

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

打开官方文档或查看源码,这些常见运算符也继承自num:

图1:num中的运算符

有其他高级运算方法的需求num无法满足,可试用dart:math库,提供如三角函数、指数、对数、平方根等高级函数。

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

Dart类型安全,不能使用 if(nonbooleanValue)assert(nonbooleanValue) 之类在js可正常工作的代码,而应显式检查值。

如下,检查变量是否为0,在Dart中需要显示地与0做比较:

// 检查是否为0.
var number = 0;
assert(number == 0);
// assert(number); 错误

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

内嵌表达式例子。把单词’cat’转成大写放入到变量s1的声明中:

var s = 'cat';
var s1 = 'this is a uppercased string: ${s.toUpperCase()}';

为了获得内嵌对象的字符串,Dart会调用对象的 toString() 方法。而常见字符串的拼接,Dart则通过内置运算符“+”实现。比如,下面这条语句会如你所愿声明一个值为’Hello World!'的字符串:

var s2 = 'Hello' + ' ' + 'World!' ;

对于多行字符串的构建,你可以通过三个单引号或三个双引号的方式声明,这与Python是一致的:

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

2.2 List与Map

其他编程语言中常见的数组和字典类型,在Dart中的对应实现是List和Map,统称为集合类型。它们的声明和使用很简单,和JavaScript中的用法类似。

接下来,我们一起看一段代码示例。

  • 在代码示例的前半部分,我们声明并初始化了两个List变量,在第二个变量中添加了一个新的元素后,调用其迭代方法依次打印出其内部元素;
  • 在代码示例的后半部分,我们声明并初始化了两个Map变量,在第二个变量中添加了两个键值对后,同样调用其迭代方法依次打印出其内部元素。
var arr1 = ["Tom", "Andy", "Jack"];
var arr2 = List.of([1,2,3]);
arr2.add(499);
arr2.forEach((v) => print('${v}'));

var map1 = {"name": "Tom", 'sex': 'male'};
var map2 = new Map();
map2['name'] = 'Tom';
map2['sex'] = 'male';
map2.forEach((k,v) => print('${k}: ${v}'));

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

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

以上述代码为例,如果往arr2集合中添加一个浮点数 arr2.add(1.1),尽管语义上合法,但编译器会提示类型不匹配,从而导致编译失败。

和Java语言类似,在初始化集合实例对象时,你可以为它的类型添加约束,也可以用于后续判断集合类型。

下面的这段代码,在增加了类型约束后,语义是不是更清晰了?

var arr1 = <String>['Tom', 'Andy', 'Jack'];
var arr2 = new List<int>.of([1,2,3]);
arr2.add(499);
arr2.forEach((v) => print('${v}'));
print(arr2 is List<int>); // true

var map1 = <String, String>{'name': 'Tom','sex': 'male',};
var map2 = new Map<String, String>();
map2['name'] = 'Tom';
map2['sex'] = 'male';
map2.forEach((k,v) => print('${k}: ${v}'));
print(map2 is Map<String, String>); // true

2.3 常量定义

如果你想定义不可变的变量,则需要在定义变量前加上final或const关键字:

  • const,表示变量在编译期间即能确定的值;
  • final则不太一样,用它定义的变量可以在运行时确定值,而一旦确定后就不可再变。

声明const常量与final常量的典型例子,如下所示:

final name = 'Andy';
const count = 3;

var x = 70;
var y = 30;
final z = x / y;

可以看到,const适用于定义编译常量(字面量固定值)的场景,而final适用于定义运行时常量的场景。

3 总结

通过上面的介绍,相信你已经对Dart的基本语法和类型系统有了一个初步的印象。这些初步的印象,有助于你理解Dart语言设计的基本思路,在已有编程语言经验的基础上快速上手。

而对于流程控制语法:如 if-else、forwhiledo-whilebreak/continue、switch-case、assert,由于与其他编程语言类似,在这里我就不做一一介绍了,更多的Dart语言特性需要你在后续的使用过程中慢慢学习。使用Dart过程, 官方文档 是最重要学习资料。

  • 在Dart中,所有类型都是对象类型,都继承自顶层类型Object,因此一切变量都是对象,数字、布尔值、函数和null也概莫能外;
  • 未初始化变量的值都是null;
  • 为变量指定类型,这样编辑器和编译器都能更好地理解你的意图。

4 FAQ

对于集合类型List和Map,如何让其内部元素支持多种类型(比如,int、double)呢?又如何在遍历集合时,判断究竟是何种类型呢?

在Dart语言中,List和Map支持存储多种类型的元素。可通过泛型指定集合内部元素的类型。如:

List<dynamic> myList = [1, 2.0, 'three'];
Map<String, dynamic> myMap = {'name': 'Alice', 'age': 30, 'height': 1.65};

List和Map的元素类型分别为dynamic,表示可存储任意类型的元素。

如要在遍历集合时判断元素类型,使用Dart中的类型检查运算符is。如:

// 使用is运算符判断了每个元素的类型,并打印了相应信息。
List<dynamic> myList = [1, 2.0, 'three'];
for (var element in myList) {
  if (element is int) {
    print('$element is an integer');
  } else if (element is double) {
    print('$element is a double');
  } else if (element is String) {
    print('$element is a string');
  }
}

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

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

相关文章

数据透视表 - 学习笔记

教程资源&#xff1a;数据透视表_哔哩哔哩_bilibili 目录 一、内容概括 数据操作&#xff1a; 案例&#xff1a; 二、数据操作 &#xff08;一&#xff09;数据清洗 &#xff08;二&#xff09;创建数据透视表 1、数据格式 2、显示方式 3、分组 4、修改数据源 5、…

Web 安全之 HSTS 详解和使用

HSTS&#xff08;HTTP Strict Transport Security&#xff09; 是一种网络安全机制&#xff0c;可用于防范网络攻击&#xff0c;例如中间人攻击和 CSRF&#xff08;Cross-Site Request Forgery&#xff09;等攻击。本文将详细介绍 HSTS 的工作原理、应用场景以及如何在网站中开…

【计算机视觉 | 目标检测】arxiv 计算机视觉关于分类和分割的学术速递(6月 22 日论文合集)

文章目录 一、分类相关(4篇)1.1 Annotating Ambiguous Images: General Annotation Strategy for Image Classification with Real-World Biomedical Validation on Vertebral Fracture Diagnosis1.2 Benchmark data to study the influence of pre-training on explanation pe…

无需专业知识!学会用TensorFlow 2实现天气识别的秘诀

💡《目标识别100例》使用的是Python语言、TensorFlow框架,包含了几十种CNN算法案例💎 附有 🖥 源码 ,可一键运行,避免调试烦恼🏆 课程大作业、毕业论文可直接考借鉴🎈 同时 附带各种算法原理及对应的代码教程,用户可根据自身情况快速排列组合,在不同的数据集上实…

从零开始:入门双目视觉你需要了解的知识

文章目录 前言 双目相机标定去畸变极线校正&#xff08;立体校正&#xff09;立体匹配深度图生成文章已经同步更新在3D视觉工坊啦&#xff0c;原文链接如下&#xff1a; 前言 双目立体视觉是计算机视觉中的一个重要领域&#xff0c;它利用两个相机拍摄同一场景的不同视角的图像…

HDLBits笔记5:Circuits.Combinational Logic.Basic gates

Wire 实现一个电路完成in和out的连线 module top_module (input in, output out);assign out in; endmoduleGND 实现一个电路将out连到GND module top_module (output out);assign out 1b0; endmoduleNOR 实现或非门 module top_module (input in1,input in2,output ou…

Vue-消息订阅与发布(pub/sub)

消息订阅与发布(pub/sub) 消息订阅与发布和全局事件总线一样&#xff0c;也是一种组件间通信的方式 pub/sub全称为publisher(订阅)/subscriber(发布),一般需要数据的人订阅消息&#xff0c;提供数据的人发布消息 这个技术非常简单容易上手&#xff0c;主要有以下两步 1 订阅…

Java集合之ArrayList详解

Java集合之ArrayList 一、ArrayList类的继承关系1. 基类功能说明1.1. Iterator&#xff1a;提供了一种方便、安全、高效的遍历方式。1.2. Collection&#xff1a;为了使ArrayList具有集合的基本特性和操作。1.3. AbstractCollection&#xff1a;提供了一些通用的集合操作。1.4.…

Vue-动画效果

vue动画效果 vue中动画效果是很简单的一个东西&#xff0c;vue帮助我们做了一些动画封装&#xff0c;同时也支持自定义动画&#xff0c;过度&#xff0c;第三方库&#xff0c;这些方式都可以实现&#xff0c;我们一一举例说明 注意&#xff1a;下面的相关截图&#xff0c;由于…

55 KVM工具使用指南-LibcarePlus概述

文章目录 55 KVM工具使用指南-LibcarePlus概述55.1 概述55.2 软硬件要求55.3 注意事项和约束 55 KVM工具使用指南-LibcarePlus概述 55.1 概述 LibcarePlus 是一个用户态进程热补丁框架&#xff0c;可以在不重启进程的情况下对 Linux 系统上运行的目标进程进行热补丁操作。热补…

语音合成 - TTS-VUE 学习

今天给小伙伴测试了一款人工智能文字合成语音的工具&#xff0c;测试中发现应该是某位大神开发的开源工具&#xff0c;经过一下午的测试&#xff0c;发现有可学习之处&#xff0c;有兴趣的小伙伴可以一起来学习下。 一、简单介绍 微软的语音合成助手利用强大的微软AI语音库&am…

牛云企业官网小程序,外卖cps权益变现,uniCloud云开发无需购买服务器和域名,助力每一位创业者。

技术优势 基于 uniapp uniCloud 研发&#xff0c;无需购买服务器和域名&#xff0c;uniCloud 是 DCloud 联合阿里云、腾讯云 serverless 构建。从此不用关心服务器运维、弹性扩容、大并发承载、防DDoS攻击等&#xff0c;轻松应对高并发应用&#xff0c; 上图 小程序页面 体…

一种新颖的智能优化算法-蝠鲼优化算法(MRFO)

目录 一、MRFO数学模型 1.1 链式觅食 1.2 旋风式觅食 1.3 翻筋斗式觅食 二、MRFO伪代码 2019年提出一种新的仿生优化技术称为魔鬼鱼觅食优化算法&#xff0c;旨在提供一种替代优化 解决实际工程问题的方法。该算法的灵感是基于智能算法魔鬼鱼的行为。这项工作模拟了魔鬼…

轻量应用服务器性能如何?CPU带宽流量系统盘测评

轻量应用服务器性能如何&#xff1f;腾讯云轻量应用服务器是一种轻量级搭建小型网站和应用的服务器&#xff0c;相对于其他更高性能配置的服务器CVM&#xff0c;性价比更高。虽然其性能不如高性能云服务器CVM&#xff0c;但对于小型网站和应用来说&#xff0c;能够提供基本的计…

JDK1.8 lambda_函数式编程_stream流

一、 lambda表达式 jdk 1.8 引入了 lambda表达式 能够我们 编写代码时更加简洁,也为函数式编程提供了支持 lambda表达式 作用 简化匿名实现类的书写&#xff0c;实现接口抽象方法&#xff1b; (参数类型 参数名1,参数类型 参数名2,……参数类型 参数名n)->{ //方法体 } …

【工具】搜狗输入法常用配置(持续更新)

▒ 目录 ▒ &#x1f6eb; 问题描述环境 1️⃣ 按键相关通用快捷键系统快捷键辅助输入快捷键 2️⃣ 其它自定义语句关闭自动更新 &#x1f6ec; 结论 &#x1f6eb; 问题 描述 作为输入法的常青树&#xff0c;重装系统后经常第一步就是装输入法&#xff0c;由于以下原因&#…

开发框架前后端分离的好处是什么

关于将前端和后端保持在一起或分开&#xff0c;存在广泛的意见分歧。唯一重要的是&#xff0c;这两个组件对于开发成熟的应用程序都是必需的。 考虑&#xff1a;紧密耦合的前端和后端 许多人认为后端和前端的分离是一个坏主意&#xff0c;这两个角色之间没有太大区别。 以下…

多旋翼无人机振动分析与减振方法

多旋翼无人机振动分析与减振方法 振动分析无人机减振设计机械减振数字滤波减振 振动分析 振动机制包括&#xff1a; 激励&#xff08;振动源&#xff09;系统响应 无人机振动机制&#xff1a; 激励 —— 动力系统&#xff08;旋翼电机&#xff09;系统 —— 机架响应 —— …

《产品思维》 要点

“一切以用户价值为依归”的价值观&#xff0c;落地下来就是从用户中来&#xff0c;到用户中去。 认知用户 用户画像 用户是一切产品的源头 用户不是理性人 我们的用户到底是谁、究 竟在哪里。这个“到底是谁”“究竟在哪里”。 用户生活工作的环境&#xff0c;是他们日常的…

【机器学习】机器故障的二元分类模型-Kaggle竞赛

竞赛介绍 数据集描述 本次竞赛的数据集&#xff08;训练和测试&#xff09;是从根据机器故障预测训练的深度学习模型生成的。特征分布与原始分布接近&#xff0c;但不完全相同。随意使用原始数据集作为本次竞赛的一部分&#xff0c;既可以探索差异&#xff0c;也可以了解在训…