【问题标题】:Use int as num in function call在函数调用中使用 int 作为 num
【发布时间】:2021-02-16 06:33:03
【问题描述】:

我正在学习 Dart,我定义了一个 sum 函数来对数字列表求和。

sum(numberList) => numberList.reduce((num a, num b) => a + b);

当我在数字列表中调用它时:

main() {
  var nl = [4, 2, 4, 5, 9];
  print(sum(nl));
}

我收到错误:

type '(num, num) => num' is not a subtype of type '(int, int) => int' of 'combine'

这让我很困惑,为什么不能在 int 列表上调用为类型 num 定义的函数?如何解决这个问题?如果列表“nl”来自我的代码之外,我如何将list of int 转换为list of num? (好像 int 的列表不是 num 的列表?疑惑。)

【问题讨论】:

    标签: dart


    【解决方案1】:

    问题是您在List<int> 上调用reduce。 其类型为int reduce(int Function(int, int) combine)

    这意味着combine 函数参数必须是返回int 的函数。 您尝试传递一个返回 num 的函数,这是不允许的。

    您没有静态地捕捉到这一点,因为您没有将参数键入sum。 尝试将其更改为:

    num sum(List<num> numberList) => numberList.reduce((num a, num b) => a + b);
    

    您可以做的是将列表转换为List&lt;num&gt;,然后将其传递给sum

    print(sum(nl.cast<num>()));
    

    【讨论】:

    • 谢谢。类型中的combine 是什么意思?是否有任何文件提到“组合”?
    • reduce 的函数参数名为combine。它只是位置参数的名称,它没有其他文档的作用。
    【解决方案2】:

    很抱歉,我无法为您提供真正的答案,但这里有一些方法可以解决您的问题。 首先显然将您的列表转换为 num 列表,通过指定泛型类型或使用 .cast :

      var nl = [4, 2, 4, 5, 9];
      print(sum(nl.cast<num>()));
    
      var nl = <num>[4, 2, 4, 5, 9];
      print(sum(nl2));
    

    或者您可能想使用一个扩展,它可以很好地适用于任何扩展 num 的列表类型:

    extension SumList<T extends num> on List<T> {
      T sum() => reduce((a, b) => a + b);
    }
    
      var nl4 = [4, 2, 4, 5, 9];
      print(nl4.sum());
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-17
      • 2017-07-16
      • 2012-07-23
      • 1970-01-01
      相关资源
      最近更新 更多