代码之家  ›  专栏  ›  技术社区  ›  Michel Feinstein

在Dart中何时使用num

  •  1
  • Michel Feinstein  · 技术社区  · 6 年前

    我是Dart的新手,我能看出Dart num 哪个是超类 int double (而且只有这两个,因为子类是编译时错误。) 号码 其他任何事情)。

    到目前为止,我看不到使用 号码 而不是 智力 双重的 ,是否有 号码 是更好还是更值得推荐?或者只是为了避免考虑数字的类型,以便编译器决定该数字是否为 智力 或者 双重的 为了我们?

    1 回复  |  直到 6 年前
        1
  •  14
  •   Saed Nabil    6 年前

    例如,一个好处 在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;
    

    x = 9;
    

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

    两者都有效。

    这是Dart 2.1之前的情况,但仍然可以帮助解释这个概念

    检查 this 可能有关联

        2
  •  2
  •   Lynn    5 年前

    不确定这是否对任何人有用,但我刚刚遇到了一个我需要的案例 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 因为 智力 它本身并没有实现 Comparable<int> .

    所以Dart无法推断类型 K 在召唤 maximumByOrNull .

    然而 号码 使生效 Comparable<num> .如果我指定:

    eldest = maximumByOrNull(students, (s) => s.age as num);         // this
    eldest = maximumByOrNull<Student, num>(students, (s) => s.age);  // or this
    

    投诉消失了。


    一句话:看起来 号码 工具 Comparable 什么时候 智力 double 不要自己动手,有时这会给泛型函数带来麻烦。

        3
  •  0
  •   Dan R    4 年前

    一个很好的 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;
      }
    }
    

    使用上面的扩展可以访问最小/最大值,而无需为类创建特定的实现 智力 双重的 .

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