压缩{| n1,n2 |在Ruby中使用n1 ^ n2}

时间:2014-03-27 22:08:39

标签: ruby symbols proc

我不是一个Ruby人,所以我可能会错过一些非常基本的东西,但我还无法弄明白:说我有一个包含任意数量的2个元素数组的数组整数。我想按位xor每组两个整数 我目前使用非常明显的

l.map {|n1, n2| n1 ^ n2}

我的第一个问题是尽可能按照l.map &:^的方式做点什么。显然这是不可能的,因为没有Array#^这样的东西,并且结果proc没有做参数解包。有没有一种很好的方法可以使用符号来处理逻辑,或者我是否坚持使用功能性的,但无疑是我目前使用的不太优雅的解决方案?

的问候,
磷酸铜

2 个答案:

答案 0 :(得分:3)

有一种方法可以使用Symbol#to_proc执行此操作,但它不会比您已有的(恰好)解决方案更好,因为它涉及定义Array#^

class Array
  def ^
    raise("Not a two-element array") unless (self.length == 2)
    raise("Array contains non-numeric values") unless (self.all? {|n| Integer === n })

    return self[0] ^ self[1]
  end
end

l.map(&:^)

答案 1 :(得分:1)

我害怕(?)你已经找到了最简单的写作方式。

有一些方法可以使用Symbol#to_proc,但它们并不那么好:

arr = [[1, 2], [2, 5], [23, 100], [5, 1], [4, 10]]

arr.map { |a, b| a ^ b }
# => [3, 7, 115, 4, 14]


arr.map { |pair| pair.reduce(&:^) }
#=> [3, 7, 115, 4, 14]