简介
有运算就有操作符,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/
最艰深的解读,最粗浅的干货,最简洁的教程,泛滥你不晓得的小技巧等你来发现!
欢送关注我的公众号:「程序那些事」, 懂技术,更懂你!