何时在Dart中使用num

何时在Dart中使用num,dart,Dart,我是Dart新手,我可以看到Dart有num,它是int和double的超类(只有这两个,因为将num子类化为其他任何类都是编译时错误) 到目前为止,我看不到使用num而不是int或double的任何好处,是否有num更好或更值得推荐的情况?或者只是为了避免考虑数字的类型,这样编译器就可以决定我们的数字是int还是double 在Dart 2.1之前: 假设你需要定义一个双变量,比如 double x ; 如果您将x定义为双精度,当您将其指定给其值时,您必须指定它,例如9.876 x = 9.

我是Dart新手,我可以看到Dart有
num
,它是
int
double
的超类(只有这两个,因为将
num
子类化为其他任何类都是编译时错误)

到目前为止,我看不到使用
num
而不是
int
double
的任何好处,是否有
num
更好或更值得推荐的情况?或者只是为了避免考虑数字的类型,这样编译器就可以决定我们的数字是
int
还是
double
在Dart 2.1之前:

假设你需要定义一个双变量,比如

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;

因此,在dart中避免整数和双精度类型之间的类型不匹配错误是一种方便的方法

两者都有效

这是Dart 2.1之前的情况,但仍有助于解释该概念


检查可能与之相关

不确定这是否对任何人有用,但我只是遇到了一个案例,在某种程度上我需要
num

我定义了一个实用函数,如下所示:

T maximumByOrNull(可编辑它,K键(T),){
我没有空
无效的
:it.reduce((a,b)=>键(a)。与(键(b))相比>0?a:b);
}
像这样调用它

eldest=maximumByOrNull(学生)=>s.age);
…当
age
int
时,由于
int
本身不实现
可比性
,导致了问题

void main() {
  final a = <int>[1,3,5];
  final b = <double>[ 0.5, 0.8, -5.0];
  print(a.min);
  print(b.max);
  
}
因此,Dart无法在调用
maximumByOrNull
时推断类型
K

但是,
num
确实实现了
compariable
。如果我指明:

eldest=maximumByOrNull(学生(s)=>s.age作为num);//这
最年长的=最大年龄(学生(s)=>s.age);//还是这个
投诉消失了



一句话:当
int
double
本身不执行时,似乎
num
实现了
compariable
,有时这会给通用函数带来麻烦。

num的一个好的用例是使用
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);
  
}
例如,我在
List
中包含扩展
MinMax
,该扩展提供了getter
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;
  }
}

所以在Dart 2.1之后没有什么好处?我不这么认为,但我现在无法在脑海中找到实际的使用情况:)在你的例子中,
9
将被解释为双
9.0
,但我不确定
num
是否也这样做。可以使用
num
的一种情况是Javascript互操作,因为JS没有区别。考虑到Dart最初是作为JS的替代品设计的(但几年前放弃了这个想法),它可能只是为了这个目的才被包括进来的。@Jacob Phillips num将9解释为int 9,这就是num的目的,这就是为什么它的混合类型。我认为你对Dart和JS的看法是正确的。