[dart学习]第三篇:dart变量介绍 (二)
本篇继续介绍dart变量类型,可参考前文:第二篇:dart变量介绍 (一)
(一)final和const类型
如果你不打算修改一个变量的值,那么就把它定义为final或const类型。其中:final变量的值只能被设置一次,const变量是编译时常量(const是隐式final)。final变量在第一次使用时初始化。(注:类实例变量可以是final类型,但不可以是const类型)
final类型的用法例子如下,在final关键字后,可选择是否显式声明变量类型:
- final name ='Bob';
- final String nameS = 'Jack Ma';
通过上边的基本用法我们可以看到:不同于C语言的const,dart的final既可以作为变量修饰词,也可以作为变量类型使用。
当你试图改变一个final类型的变量值时会发生什么?我们来试一下,对上例添加如下修改:
- name = 'ma yun';
看,编译器提示你出错了!所以,final变量被初始化之后是不能修改其值的。
关于const类型,官方给的说明是“编译时常量”,我目前理解也不是太深刻,直接举个栗子吧:
- var foo = const [];
- final bar = const [];
- const baz = [];
以上用法都是合法的,你还可以做如下操作,也是合法的,因为foo是var类型:
- foo = [,,];
但你不可以做下边的操作,,因为baz是const类型的:
- baz = [,,];
下边看一种const使用的特殊情况,大家自己体会体会吧:
- //以下3行代码合法
- const a = ;
- const b = ;
- const c = a * b;
- //以下代码编译出错,因为a是int而不是const类型的
- int a = ;
- const b = ;
- const c = a * b;
- //以下两行代码合法,因为2当作const常量类型
- const b = ;
- const c = * b;
(二)Built-in类型
Dart语言支持以下8种内建数据类型。
(1)Numbers类型
Dart的数字类型有两种:int和double。int变量通常不超过64bit,这取决于运行平台。double是64bit双精度浮点型。
int和double都是num的子类型,num类型包括一些基本的操作,如+-*/,(位操作符,如>>,是在int类里定义的),如果num或num子类型不能满足你的需求,试试dart:math库。
关于什么是整型数、什么是浮点数就不再举例子了啊,另外浮点数支持科学表示法。int类型可根据需要自动转换为double类型,如: double a = 1;
下边举例看看字符串和数字之间的转换,这个我觉得通常挺有用的:
- int i = int.parse(''); //把字符串‘126’转化为整数126
- double db = double.parse("12.36"); //把字符串'12.36‘转化为12.36
- String str = i.toString(); //把整型数字126(变量i)转化为字符串’126‘
- //下边一行语句把12.36转化为字符串,小数点后保留1位,自动四舍五入
- String pStr = db.toStringAsFixed();
int类型的变量可以进行位运算操作,如下,不再细述:
- int a = <<;
- int b = |;
- int c = >>;
(2)String类型
Dart的字符串是utf-16的序列。dart和python类似,可以使用双引号,也可以使用单引号创建字符串。
下面看一个例子(完整,可编译),这个栗子里边包含了两个很小、却很关键的知识点:
- main()
- {
- String s1 = 'Jack Ma';
- String s2 = '$s1 is ma yun';
- int i1 = ;
- String s3 = 'I have ${i1.toString()} yuan';
- print(s2);
- print(s3);
- if('Jack Ma is ma yun' == s2)
- {
- print('***');
- }
- }
上述代码的运行结果是:
知识点:
1、你可以使用 ${expression} 将表达式的值嵌入到一个字符串中(如上例中s3变量),如果表达式只是一个标识符,则可以直接省略{}, 如上例中的s2变量;
2、可以使用 == 操作符比较两个字符串是否相同。
下面再看一个例子:
- main()
- {
- String s1 = 'Jack Ma';
- String s2 = ' is ';
- String s3 = 'Ma yun';
- String s4 = s1 +s2 +s3;
- String s5 = 'Jack Ma'' is ''Ma yun';
- print(s5);
- }
上例运行的结果是
Amazing!!!我们看看s5是个什么变量,字符串,我们再看看它是怎么赋值的?我的天呐, 把 'Jack ma'、' is '和'Ma yun'三个字符串紧挨着放在一起,dart就能把他们合并成一个字符串变量。大家可以打印下s4观察输出。
知识点:
1、可以使用 + 操作符,将多个字符串进行拼接;
2、可以把相邻的字符串放在一起,编译器自动为你拼接;
3、可以使用三个引号(双引号或单引号均可)创建跨行字符串(和Python类似);
4、可以通过前缀r来创建原始字符串(和Python类似,原始字符串不对转义字符进行特殊处理,如 r'hh\n' 不会将\n处理为换行)。
(3)Booleans类型
Dart使用类型bool来表示boolean值,只有两个对象是bool类型:true和false,这两个都是编译时常量。
bool类型比较简单,官网唯一的提示就是 不能使用 if(非布尔值) 或 assert(非布尔值) 这样的表达式。
(4)Lists类型
在Dart中,数组是列表对象。看下例子:
- var list_a = [,,];
//list_a[0] = 'string'; Error
以上程序,dart推断list_a是 List<int> ,当你试图添加一个非整型数据进去时,编译器会报错。
dart的数组像C语言一样,下标从0开始,到length-1为止,其中,可以通过list.length获取得数组的长度,如下:
- main()
- {
- var list_a = const [,,]; // 定义一个编译时常量list
- print(list_a[]); // 打印:2
- print(list_a[]); // 打印:6
- print(list_a.length); // 打印:3
- }
(5)Sets类型
Dart中的set是一系列无序项的集合。看一个简单的例子:
- var set_exam = {'set111', 'set222', 'set333'};
上例中,dart能够推断出set_exam是String类型的set,当你试图追加非string类型的值时,会报错。
当你想创建一个空的set时,需要在{}符号前添加set里变量的类型,或者使用set类型创建,如:
- //创建一个set,其中可存放string类型的值
- var names = <String>{};
- 或者
- Set<String> names = {}; //与上面的等价
- //var names = {}; 这句话就不行了,这是创建了一个map,而不是set
向一个set中添加数据可使用add()或addAll()方法,如下例:
- var set_1 = {'111', '222', '333'};
- var set_2 = <String>{};
- set_2.add('Add method');
- set_2.addAll(set_1);
使用 length 属性去获取一个set里的元素个数,如:
- var set_1 = {'111', '222', '333'};
- var set_2 = <String>{};
- set_2.add('Add method');
- set_2.addAll(set_1);
- var set_num = set_2.length;
- print(set_num); //打印出的值为 4
创建一个const的set,可直接在{}前添加const修饰.
(6)Maps类型
Dart的map是一种key-value键对的类型,key和value均可以是任意值。一个key只能对应一个value,但是一个value却可以有多个key。看一个map的简单例子吧:
- var map_1 = {'first':'111', 'second':'222', 'third':'333'};
- var map_2 = {1:'111', 2:'111', 3:'333'};
上例中,dart推断map_1是 Map<String,String> 类型,而map_2是 Map<int, String> 类型。同set一样,在类型确定后,你不能再添加非此类型的键值对了。
也可以使用Map构造一个map变量:
- var gifts = Map();
- gifts['first'] = 'partridge';
- gifts['second'] = 'turtledoves';
- gifts['fifth'] = 'golden rings';
向一个map变量中添加键值对:
- var gifts = {'first': 'partridge'};
- gifts['fourth'] = 'calling birds'; // Add a key-value
可以直接 String st=gifts['first']; 来获取某个键对应的值,当这个键在map中不存在时,将返回null.
像set一样,map也可以使用 .length 来获取其中的键值对数,不再细述。
(7)Runes类型
Dart的rune类型主要是unicode编码之类的,我还没看太明白。。。
(8)Symbols类型
Dart的Symbol表示程序中出现的操作符或标识符,实际编程中没啥接触,不再细述。
[dart学习]第三篇:dart变量介绍 (二)的更多相关文章
- 【转载】salesforce 零基础开发入门学习(三)sObject简单介绍以及简单DML操作(SOQL)
salesforce 零基础开发入门学习(三)sObject简单介绍以及简单DML操作(SOQL) salesforce中对于数据库操作和JAVA等语言对于数据库操作是有一定区别的.salesfo ...
- Docker学习(三): Dockerfile指令介绍
特别声明: 博文主要是学习过程中的知识整理,以便之后的查阅回顾.部分内容来源于网络(如有摘录未标注请指出).内容如有差错,也欢迎指正! =============系列文章============= 1 ...
- [dart学习]第四篇:函数和操作符(本篇未完待续)
接着学习dart的函数和操作符. 1.函数Function dart是一种真正的面向对象的语言,通常一个函数也是Function类型的对象,这也就是说可以把函数赋值给一个变量,或者作为另一个函数的入参 ...
- [dart学习]第七篇:类(构造函数)
前言:楼主平时基本没有使用过异常处理,所以对异常的认知可能不够准确,这里就不翻译异常的相关内容了,大家可以去官网自行阅读介绍,地址 https://dart.dev/guides/language/l ...
- [dart学习]第五篇:操作符
前言:本系列内容假设读者有一定的编程基础,如了解C语言.python等. 本节一起来学习dart的操作符,直接拷贝官网的操作符描述表如下: Description Operator unary pos ...
- [dart学习]第六篇:流程控制语句
经过前面的基础知识了解学习,我们今天可以进入语句模块啦. dart主要有以下流程控制语句: if-else for循环 while和do-while循环 break和continue switch-c ...
- Java学习笔记三:Java的变量、常量、变量的类型及使用规则
Java的变量.常量.变量的类型及使用规则 每一种语言都有一些具有特殊用途的词,Java也不例外,它们被称为关键字.关键字对 Java 的编译器有着特殊的意义. 一:Java中的关键字: 注:Java ...
- salesforce 零基础开发入门学习(三)sObject简单介绍以及简单DML操作(SOQL)
salesforce中对于数据库操作和JAVA等语言对于数据库操作是有一定区别的.salesforce中的数据库使用的是Force.com 平台的数据库,数据表一行数据可以理解成一个sObject变量 ...
- cocos2d-x学习记录第一篇-环境变量配置
最近准备学习cocos2d-x,之前一直是做iOS开发的,算是零基础开始学习吧. (此条后来修改,不用配置下面这些东西,下载一个cocosstudio就可以了,直接在里边就创建工程了) 本人用Mac电 ...
随机推荐
- 关于“svn: Can't connect to host '*.*.*.*': 由于连接方在一段时间后没有正确答复或连接”的解决方法
阿里云服务器环境(PHP+Nginx+MySQL) [原因1]svnserve.conf 没写好,当然你先备份一份先: cp svnserve.conf svnserve.conf.bak 打开此文件 ...
- 如何追踪产生大量REDO的来源
从10点到12点数据库中对象块变化排名靠前的对象 select to_char(begin_interval_time,'YYYY_MM_DD HH24:MI') snap_time, dhsso.o ...
- [ionic3.x开发记录]参考ionic的float-label动效,写一个项目内通用的input组件,易扩展
上图: module: import {NgModule} from "@angular/core"; import {CommonModule} from "@angu ...
- springboot+spring security +oauth2.0 demo搭建(password模式)(认证授权端与资源服务端分离的形式)
项目security_simple(认证授权项目) 1.新建springboot项目 这儿选择springboot版本我选择的是2.0.6 点击finish后完成项目的创建 2.引入maven依赖 ...
- linux alias 命令 查看系统设置的命令别名
alias命令用于查看或设置命令别名,但仅作用于该次登陆的会话,若要永久使用别名,可在 ~/.bashrc 中设定别名 [root@MongoDB ~]# alias // 查看别名 [root@Mo ...
- java项目对jar包加密流程,防止反编译
Java 开发语言以其安全性高.代码优化.跨平台等特性,迅速取代了很多传统高级语言,占据了企业级网络应用开发等诸多领域的霸主地位.特别是近年来大数据.互联网+.云计算技术的不断发展,Java 开发语言 ...
- Linux 下如何修改用户名(同时修改用户组名和家目录)
有时候,由于某些原因,我们可能会需要重命名用户名.我们可以很容易地修改用户名以及对应的家目录和 UID.-- Shusain 本文导航◈ 修改用户名12%◈ 修改家目录43%◈ 更改用户 UID52% ...
- 出现error: command 'x86_64-linux-gnu-gcc' failed with exit status 1
查看自己python的版本,然后下载自己版本Python的devel,比如python3.6.8就是 sudo apt-get install python3.6-dev
- MATLAB矩阵运算
1. 矩阵的加减乘除和(共轭)转置 (1) 矩阵的加法和减法 如果矩阵A和B有相同的维度(行数和列数都相等),则可以定义它们的和A+B以及它们的差A-B,得到一个与A和B同维度的矩阵C,其中Cij=A ...
- C# 字段和属性
最大的疑惑就是:有了字段,为什么还要有属性呢? 如果在一个类中有一个公有字段,那么在这个类的外部我们可以自由无阻的使用这个字段,但是如果给这个字段赋了一个很“离谱”的值,那这对程序可能会造成很大的影响 ...