使用Ruby'不正确吗;s arr.inject(:+;)或JavaScript';s arr.reduce((a,b)=>;{返回a+;b})来对数字数组求和?
我以前认为鲁比使用Ruby'不正确吗;s arr.inject(:+;)或JavaScript';s arr.reduce((a,b)=>;{返回a+;b})来对数字数组求和?,javascript,ruby,reduce,inject,Javascript,Ruby,Reduce,Inject,我以前认为鲁比 arr.inject(:+) 还是JavaScript的 arr.reduce((a, b) => { return a + b }) // a cooler way arr.reduce( (a, b) => a + b ) 两者都相当于对数组项求和。但是,由于这样一种情况,它实际上是不正确的:如果数组是空的呢 Ruby将返回nil,JavaScript将引发异常。因此,除了使用初始值,还有更好的方法吗?要处理空数组引发的异常,请声明初始值 var ar
arr.inject(:+)
还是JavaScript的
arr.reduce((a, b) => { return a + b })
// a cooler way
arr.reduce( (a, b) => a + b )
两者都相当于对数组项求和。但是,由于这样一种情况,它实际上是不正确的:如果数组是空的呢
Ruby将返回
nil
,JavaScript将引发异常。因此,除了使用初始值,还有更好的方法吗?要处理空数组引发的异常,请声明初始值
var arr=[],
res=arr.reduce((a,b)=>{returna+b},0);
//^^初始值
控制台日志(res)代码>若要处理空数组引发的异常,请声明初始值
var arr=[],
res=arr.reduce((a,b)=>{returna+b},0);
//^^初始值
控制台日志(res)代码>Ruby可以接受两个参数,第一个是初始值。如果可枚举的中没有元素,则此初始值将成为返回值:
[].inject(:+)
# nil
[].inject(0,:+)
# 0
正如@Ursus在评论中提到的,Ruby 2.4使用默认值0
:
[].sum
# 0
另外,对于某些对象(),它的速度也快得多
请注意,返回nil
有时可能是期望的结果,具体取决于后面的进程
最后,当数组为空且未定义默认值时,JS值得称赞。这可能是最干净的解决方案。Ruby可以接受两个参数,第一个是初始值。如果可枚举的中没有元素,则此初始值将成为返回值:
[].inject(:+)
# nil
[].inject(0,:+)
# 0
正如@Ursus在评论中提到的,Ruby 2.4使用默认值0
:
[].sum
# 0
另外,对于某些对象(),它的速度也快得多
请注意,返回nil
有时可能是期望的结果,具体取决于后面的进程
最后,当数组为空且未定义默认值时,JS值得称赞。这可能是最干净的解决方案。仅仅因为您使用带有隐式类型的动态类型语言,并不意味着您不必考虑类型
在其他语言中,这两个操作有不同的名称(例如在Haskell和Scala和中),而在Ruby中,它们是重载的,但问题仍然是它们是两个不同的操作:
常规折叠操作
- 对
a
s的集合进行操作
- 具有类型为
B
- 以及一个组合函数,它接受a
B
和aa
并返回aB
也就是说
- 它可以返回元素类型以外的类型的对象(它返回的是
B
,而不是a
)
- 它可以对空集合进行操作
受约束的reduce
操作
- 对
a
s的集合进行操作
- 没有零元素,它使用集合的一个元素,其类型为
A
- 以及一个组合函数,它接受
a
和a
,并返回a
也就是说
- 它只能返回与元素类型相同类型的对象(它返回
A
)
- 它只能对非空集合进行操作
这也是Haskell名称的来源,它被称为foldl1
,因为它至少需要1个元素,并且以元素编号1作为初始元素
请注意,常规的折叠
操作严格来说比受约束的减少
操作更强大。事实上,一般的折叠
操作是一个,它可以做foreach
循环可以做的任何事情:映射
,分组
,排序
,uniq
,反向
,…你可以这么说。每个收集操作都可以实现为折叠
例如:
模块可枚举
反方向
注入([]){| acc,el |[el]+acc}
结束
#这并不完全相同,因为它并不懒惰
我的名字是什么?
注入(假){| acc,el | acc |屈服el}
结束
结束
reduce
不是万能的。例如,不能使用reduce
实现reverse
,因为reduce
返回A
,但reverse
返回集合;但是,这仅适用于元素求和的特定情况,但例如,不适用于将元素相乘的实际相同问题。仅仅因为您使用具有隐式类型的动态类型语言,并不意味着您不必考虑类型
在其他语言中,这两个操作有不同的名称(例如在Haskell和Scala和中),而在Ruby中,它们是重载的,但问题仍然是它们是两个不同的操作:
常规折叠操作
- 对
a
s的集合进行操作
- 具有类型为
B
- 以及一个组合函数,它接受a
B
和aa
并返回aB
也就是说
- 它可以返回元素类型以外的类型的对象(它返回的是
B
,而不是a
)
- 它可以对空集合进行操作
受约束的reduce
操作
- 对
a
s的集合进行操作
- 没有零元素,它使用集合的一个元素,其类型为
A
- 以及一个组合函数,该组合函数采用
a
和a
和re