什么是最简单,最像Ruby的方式呢?
[1, 3, 10, 5].diff
Run Code Online (Sandbox Code Playgroud)
应该产生
[2, 7, -5]
Run Code Online (Sandbox Code Playgroud)
也就是说,一阶差分的数组.我想出了一个解决方案,我将在下面添加,但它需要ruby 1.9并不是那么光滑.还有什么可能吗?
我喜欢这种功能风格:
module Enumerable
def diff
each_cons(2).map {|pair| pair.reverse.reduce :-}
end
end
Run Code Online (Sandbox Code Playgroud)
编辑:我刚刚意识到reverse完全没必要.如果这是一种函数式语言,我会使用模式匹配,但Ruby不支持模式匹配.然而,它确实支持解构绑定,这对于这种情况下的模式匹配来说是足够好的近似.
each_cons(2).map {|first, second| second - first}
Run Code Online (Sandbox Code Playgroud)
但是,没有笑脸.
我喜欢这听起来如果你只是从左到右大声读出它:"对于每一对,应用该对的第一和第二元素之间的差异." 事实上,我通常不喜欢这个名字collect,map而是喜欢这个名字,但在这种情况下读起来更好:
each_cons(2).collect {|first, second| second - first}
Run Code Online (Sandbox Code Playgroud)
"对于每一对,收集其元素之间的差异." 听起来几乎就像一阶差异的定义.
还有另一种方式..似乎是迄今为止最短的:)
module Enumerable
def diff
self[1..-1].zip(self).map {|x| x[0]-x[1]}
end
end
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
671 次 |
| 最近记录: |