在Dart中的迭代器上创建sum,min,max属性 [英] Creating sum, min, max properties on iterators in Dart

查看:180
本文介绍了在Dart中的迭代器上创建sum,min,max属性的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有以下内容,适用于int s:

I have the following, which works for ints:

extension IterableInt on Iterable<int> {
  int get max => reduce(math.max);
  int get min => reduce(math.min);
  int get sum => reduce((a, b) => a + b);
}

我想让它更通用,以包括小数点并创建它:

I wanted to make this more general to include decimals and created this:

extension IterableNum on Iterable<num> {
  num get max => reduce(math.max);
  num get min => reduce(math.min);
  num get sum => reduce((a, b) => a + b);
}

使用以下测试,这些测试大多会失败:

These mostly fail, using the following tests:

void main(List<String> args) {
  print([1.2, 1.3, 5, 2.2].sum); //works
  print([1.2, 1.3, 5, 2.2].max); //works
  print([1.2, 1.3, 5, 2.2].min); //works
  print([1.2, 1.3, 5.0, 2.2].sum); //does not work

  print([1, 2, 3].max); //does not work
  print([1, 2, 3].min); //does not work
  print([1, 2, 3].sum); //does not work
}

对于decimal情况返回的错误是:

The error returned for the decimal case is:

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

int类似,在消息中引用int而不是double.

It's similar for int, referring to int instead of double in the message.

模式似乎是,如果列表中包含intdecimal的混合,那就很好.如果全部为int或全部为decimal,则失败.

The pattern seems to be that if there is a mixture of ints and decimals in the list then it's fine. If it's all ints or all decimals, it fails.

我已经使用fold重新定义了属性(并添加了multiply),并且可以正常工作:

I've redefined the properties (and added multiply) using fold and this works:

extension IterableNum on Iterable<num> {
  num get max => fold(first, math.max);
  num get min => fold(first, math.min);
  num get sum => fold(0, (a, b) => a + b);
  num get multiply => fold(1, (a, b) => a * b);
}

有人可以解释为什么IterableNum的第一个版本(使用reduce)不起作用吗?

Can someone explain why the first version of IterableNum (using reduce) does not work?

推荐答案

它不起作用,因为您创建了更高级别的列表(num类型的子类).

It does not work because you create lists of higher levels (subclasses of num type).

您的(扩展)代码应该更通用(更通用).
像这样的代码:extension IterableNum<T extends num> on Iterable<T>.

Your (extension) code should be more generic (more universal).
Like this code: extension IterableNum<T extends num> on Iterable<T>.

void main(List<String> args) {
  print([1.2, 1.3, 5, 2.2].runtimeType);
  print([1.2, 1.3, 5.0, 2.2].runtimeType);
}

结果:

List<num>
List<double>

更正代码如下:

import 'dart:math' as math;

void main(List<String> args) {
  print([1.2, 1.3, 5, 2.2].runtimeType);
  print([1.2, 1.3, 5.0, 2.2].runtimeType);

  print([1.2, 1.3, 5, 2.2].sum); //works
  print([1.2, 1.3, 5, 2.2].max); //works
  print([1.2, 1.3, 5, 2.2].min); //works
  print([1.2, 1.3, 5.0, 2.2].sum); // WORKS!!!

  print([1, 2, 3].max); // WORKS!!!
  print([1, 2, 3].min); // WORKS!!!
  print([1, 2, 3].sum); // WORKS!!!
}

extension IterableNum<T extends num> on Iterable<T> {
  T get max => reduce(math.max);
  T get min => reduce(math.min);
  T get sum => reduce((a, b) => a + b as T);
}

结果:

List<num>
List<double>
9.7
5
1.2
9.7
3
1
6

这篇关于在Dart中的迭代器上创建sum,min,max属性的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆