Ruby中的一阶数组差异

Pet*_*ter 6 ruby

什么是最简单,最像Ruby的方式呢?

[1, 3, 10, 5].diff
Run Code Online (Sandbox Code Playgroud)

应该产生

[2, 7, -5]
Run Code Online (Sandbox Code Playgroud)

也就是说,一阶差分的数组.我想出了一个解决方案,我将在下面添加,但它需要ruby 1.9并不是那么光滑.还有什么可能吗?

Jör*_*tag 5

我喜欢这种功能风格:

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)

"对于每一对,收集其元素之间的差异." 听起来几乎就像一阶差异的定义.


pie*_*fou 2

还有另一种方式..似乎是迄今为止最短的:)

  module Enumerable
    def diff
        self[1..-1].zip(self).map {|x| x[0]-x[1]}
    end    
  end
Run Code Online (Sandbox Code Playgroud)