何时在Dart中使用num

时间:2018-11-27 20:35:57

标签: dart

我是Dart的新手,我可以看到Dart具有numint的超类double(并且只有这两个,因为这是子类{的编译时错误) {1}}。

到目前为止,我看不到使用num而不是numint的任何好处,是否有任何情况下double更好或更不推荐?还是只是为了避免考虑数字的类型,以便编译器将决定数字对我们来说是num还是int

3 个答案:

答案 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);

…在ageint时引起麻烦,因为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

投诉消失了。


最底线:当numComparable本身不执行时,int似乎实现了double,有时这会给通用函数带来麻烦。

答案 2 :(得分:0)

num的一个很好的用例是与int double一起使用的扩展。

作为示例,我在MinMax上包括扩展名List<num>,该扩展名提供了吸气剂minmax

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;
  }
}

使用上面的扩展名可以访问最小值/最大值,而无需为类intdouble创建特定的实现。

void main() {
  final a = <int>[1,3,5];
  final b = <double>[ 0.5, 0.8, -5.0];
  print(a.min);
  print(b.max);
  
}