dart系列之:dart语言中的特殊操作符

简介

有运算就有操作符,dart中除了普通的算术运算的操作符之外,还有自定义的非常特殊的操作符,今天带大家一起来探索一下dart中的特殊操作符。

普通操作符

普通操作符就很好解释了,就是加减乘除,逻辑运算符,比较运算符和位运算符等。

这些操作符和其他语言的操作符没什么差别,这里就不详细介绍了。大家看几个普通操作符的例子:

a++
a + b
a = b
a == b
c ? a : b
assert(2 == 2);
assert(2 != 3);
assert(3 > 2);
assert(2 < 3);

类型测试操作符

dart中的类型测试符类似JAVA中的instance of操作,主要有三个,分别是as,is和is!

其中is是类型判断操作符,而as是类型转换操作符,也就是常说的强制转换。

对下面的语句来说,如果obj是T的子类或者实现了T的接口,那么就会返回true。

obj is T

而下面的语句则会始终返回true:

obj is Object?

dart中的as操作符表示的是类型转换,转换类型之后就可以使用对应类型中的方法了。如下所示:

(student as Student).firstName = 'Bob';

那么问题来了,上面的写法和下面的写法有什么区别吗?

if (student is Person) {
// Type check
student.firstName = 'Bob';
}

第一种写法中,如果student是空,或者不是Student的实例,则会报错,而第二种并不会。

条件运算符

dart中也支持条件运算符,最常见的就是三元运算符:

condition ? expr1 : expr2

表示如果condition是true,则返回expr1, 否则返回expr2。

我们在日常的工作中,经常会有一些判空操作,dart为我们提供了非常简便的判空操作符:

expr1 ?? expr2

上式表示如果expr1为空,则选择expr2。举个例子:

String playerName(String? name) => name ?? 'Guest';

级联符号

级联符号是 .. 或者?.. , 用来在同一对象上进行序列操作,级联操作可以让我们少写很多代码,可以在创建一个对象的同时,给对象赋值:

var paint = Paint()
..color = Colors.black
..strokeCap = StrokeCap.round
..strokeWidth = 5.0;

上面的代码等同于:

var paint = Paint();
paint.color = Colors.black;
paint.strokeCap = StrokeCap.round;
paint.strokeWidth = 5.0;

如果对象可能为空,则可以在第一个级联操作符之前加上?,这样如果对象为空的话,后续的级联操作都不会进行,如下所示:

var paint = Paint()
?..color = Colors.bla
..strokeCap = Stroke
..strokeWidth = 5.0;

类中的自定义操作符

在dart中可以实现类似C++那种操作符的重写功能。可以实现对象之间的加减乘除之类的运算。

比如下面的类中,我们自定义了类之间的加法和减法运算:

class Vector {
final int x, y; Vector(this.x, this.y); Vector operator +(Vector v) => Vector(x + v.x, y + v.y);
Vector operator -(Vector v) => Vector(x - v.x, y - v.y); // Operator == and hashCode not shown.
// ···
} void main() {
final v = Vector(2, 3);
final w = Vector(2, 2); assert(v + w == Vector(4, 5));
assert(v - w == Vector(0, 1));
}

自定义操作符是用operator关键字来修饰的,非常的方便。

总结

以上就是dart中的操作符的介绍和使用。

本文已收录于 http://www.flydean.com/04-dart-operator/

最通俗的解读,最深刻的干货,最简洁的教程,众多你不知道的小技巧等你来发现!

欢迎关注我的公众号:「程序那些事」,懂技术,更懂你!

dart系列之:dart语言中的特殊操作符的更多相关文章

  1. dart系列之:dart类中的泛型

    目录 简介 为什么要用泛型 怎么使用泛型 类型擦除 泛型的继承 泛型方法 总结 简介 熟悉JAVA的朋友可能知道,JAVA在8中引入了泛型的概念.什么是泛型呢?泛型就是一种通用的类型格式,一般用在集合 ...

  2. dart系列之:dart代码最佳实践

    目录 简介 命名规则 import中的顺序 格式化 总结 简介 每种语言都有自己的代码风格,这种代码风格是跟语言特性息息相关的.如果在编码的过程中遵循这种统一的编码规则,会给我们的业务带来非常多的便利 ...

  3. dart系列之:dart语言中的变量

    目录 简介 dart中的变量 定义变量 变量的默认值 Late变量 常量 总结 简介 flutter是google在2015年dart开发者峰会上推出的一种开源的移动UI构建框架,使用flutter可 ...

  4. dart系列之:dart语言中的内置类型

    目录 简介 Null 数字 字符串 布尔值 列表 set和map 简介 和所有的编程语言一样,dart有他内置的语言类型,这些内置类型都继承自Object,当然这些内置类型是dart语言的基础,只有掌 ...

  5. dart系列之:dart语言中的函数

    目录 简介 函数的参数 main函数 匿名函数 闭包 函数的返回值 总结 简介 函数是所有编程语言都有的内容,不管是面向对象还是面向过程,函数都是非常重要的一部分.dart中的函数和java中的函数有 ...

  6. dart系列之:dart语言中的异常

    目录 简介 Exception和Error Throw和catch Finally 总结 简介 Exception是程序中的异常情况,在JAVA中exception有checked Exception ...

  7. dart系列之:dart类中的构造函数

    目录 简介 传统的构造函数 命名构造函数 构造函数的执行顺序 重定向构造函数 Constant构造函数 工厂构造函数 总结 简介 dart作为一种面向对象的语言,class是必不可少的.dart中所有 ...

  8. dart系列之:dart中的异步编程

    目录 简介 为什么要用异步编程 怎么使用 Future 异步异常处理 在同步函数中调用异步函数 总结 简介 熟悉javascript的朋友应该知道,在ES6中引入了await和async的语法,可以方 ...

  9. dart系列之:dart优秀的秘诀-隔离机制

    目录 简介 dart中的隔离机制 生成一个Isolate Isolate之间的交互 一个例子 总结 简介 之前介绍了很多dart中的异步编程技巧,不知道大家有没有发现一个问题,如果是在java的异步编 ...

随机推荐

  1. CF802O-April Fools‘ Problem(hard)【wqs二分,优先队列】

    正题 题目链接:https://www.luogu.com.cn/problem/CF802O 题目大意 \(n\)天每条有\(a_i\)和\(b_i\). 每条可以花费\(a_i\)准备至多一道题, ...

  2. 分组密码(四)AES算法① — 密码学复习(七)

    介绍完S-PN型结构之后,下面介绍AES算法.由于内容比较多所以将其分为两篇来介绍,本篇主要讲AES的历史时间节点.产生背景.与DES的对比.算法框图(粗略)以及一些数学基础. 7.1 AES的历史时 ...

  3. SpringBoot 简易实现热搜邮件推送,妈妈再也不用担心我不了解国家大事了

    1.前言 上班的时候,无聊的时候,偶尔跑去百度看下热搜,所以就萌生出这种想法,通过邮件推送的方式实现效果,首先找到百度热搜的页面 热搜,话不多说,直接开干. 2.环境准备 因为是个SpringBoot ...

  4. 把之前CompletableFuture留下的坑给填上。

    你好呀,我是歪歪. 填个坑吧,把之前一直欠着的 CompletableFuture 给写了,因为后台已经收到过好几次催更的留言了. 这玩意我在之前写的这篇文章中提到过:<面试官问我知不知道异步编 ...

  5. Unity——资源文件夹介绍

    Unity资源文件夹介绍 1.编辑时 在Asset文件下存在Resources和SteamingAsset文件夹: Resources 只读不可修改,打包时直接写死,没有办法通过热更新替换资源: 可以 ...

  6. SSM框架项目的mvc拦截器

    为了防止用户在不登录的情况下通过并接请求直接访问系统,我们需要通过session和拦截器来防止这样的情况. 拦截器的配置: 为拦截器建立一个包:interceptor,并在包里建立 LoginInte ...

  7. Java泛型背后是什么?

    文Java中泛型的应用,让大家更好地理解泛型,以及常说的泛型类型擦除是什么概念,举一个简单的例子,如下: 这里可以看出来在代码编写阶段就已经报错了,不能往string类型的集合中添加int类型的数据. ...

  8. Less-23 preg_replace1

    Less-23: 直接跳到Less-23的原因是,Less-(11~22)均为注入点不为get方式的注入.我先把get型注入写的差不多,再回来整理关于注入点的内容. 核心语句: 查询.报错均有回显. ...

  9. Spring 5 MVC 中的 Router Function 使用

    Spring 5 发行已经好几年了,里面提出了好几个新点子.其中一个就是 RouterFunction,这是个什么东西呢? Spring框架给我们提供了两种http端点暴露方式来隐藏servlet原理 ...

  10. UltraSoft - Alpha - Scrum Meeting 7

    Date: Apr 22th, 2020. Scrum 情况汇报 进度情况 组员 负责 昨日进度 后两日任务 CookieLau PM 完成课程中心的json格式传递 完成邮箱验证机制 刘zh 前端 ...