我是Dart的新手,我可以看到Dart具有num
和int
的超类double
(并且只有这两个,因为这是子类{的编译时错误) {1}}。
到目前为止,我看不到使用num
而不是num
或int
的任何好处,是否有任何情况下double
更好或更不推荐?还是只是为了避免考虑数字的类型,以便编译器将决定数字对我们来说是num
还是int
?
答案 0 :(得分:2)
例如一个好处 Dart 2.1之前的版本:
假设您需要定义一个double变量,如
double x ;
如果将x定义为双精度型,则将其分配给它的值时,必须指定它,例如9.876。
x = 9.876;
到目前为止一切都很好。
现在您需要为其分配一个值,例如9
您不能这样编码
x = 9; //this will be error before dart 2.1
所以您需要像
那样编码x = 9.0;
但是如果您将x定义为num
您可以使用
x = 9.0;
和
x = 9;
因此,这是避免在dart中整数和双精度类型之间出现类型不匹配错误的便捷方法。
都是有效的。
这是Dart 2.1之前的情况,但仍然可以帮助解释这一概念
检查this可能与之相关
答案 1 :(得分:0)
不确定这是否对任何人都有用,但是我遇到了需要以某种方式使用num
的情况。
我定义了这样的实用函数:
T maximumByOrNull<T, K extends Comparable<K>>(Iterable<T> it, K key(T),) {
return it.isEmpty
? null
: it.reduce((a, b) => key(a).compareTo(key(b)) > 0 ? a : b);
}
并像这样调用它……
eldest = maximumByOrNull(students, (s) => s.age);
…在age
是int
时引起麻烦,因为int
本身未实现Comparable<int>
。
因此Dart无法在调用K
时推断类型maximumByOrNull
。
但是,num
确实实现了Comparable<num>
。如果我指定:
eldest = maximumByOrNull(students, (s) => s.age as num); // this
eldest = maximumByOrNull<Student, num>(students, (s) => s.age); // or this
投诉消失了。
最底线:当num
和Comparable
本身不执行时,int
似乎实现了double
,有时这会给通用函数带来麻烦。
答案 2 :(得分:0)
num
的一个很好的用例是与int
和 double
一起使用的扩展。
作为示例,我在MinMax
上包括扩展名List<num>
,该扩展名提供了吸气剂min
和max
。
extension MinMax on List<num>{
/// Returns the maximum value or `null` if the list is empty.
num get max {
return (isNotEmpty)
? fold<num>(0, (prev, current) => (prev > current) ? prev : current)
: null;
}
/// Returns the minimum value or `null` if the list is empty.
num get min {
return (isNotEmpty)
? fold<num>(0, (prev, current) => (prev < current) ? prev : current)
: null;
}
}
使用上面的扩展名可以访问最小值/最大值,而无需为类int
和double
创建特定的实现。
void main() {
final a = <int>[1,3,5];
final b = <double>[ 0.5, 0.8, -5.0];
print(a.min);
print(b.max);
}