在Dart中的迭代器上创建sum,min,max属性 [英] Creating sum, min, max properties on iterators in Dart
问题描述
我有以下内容,适用于int
s:
I have the following, which works for int
s:
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.
模式似乎是,如果列表中包含int
和decimal
的混合,那就很好.如果全部为int
或全部为decimal
,则失败.
The pattern seems to be that if there is a mixture of int
s and decimal
s in the list then it's fine. If it's all int
s or all decimal
s, 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屋!