是否有Ruby内置的zip
函数的等价物?如果没有,有没有一种简洁的方式来做同样的事情?
一些背景信息:当我试图找到一个干净的方法来检查涉及两个数组的数据时,这个问题就出现了。如果我有zip
,我可以写出类似以下的代码:
zip(a, b).all? {|pair| pair[0] === pair[1]}
如果没有任何类似于 zip
的内容,我也可以接受一种干净的方式来完成这个任务(其中“干净”意味着“没有显式循环”)。
是否有Ruby内置的zip
函数的等价物?如果没有,有没有一种简洁的方式来做同样的事情?
一些背景信息:当我试图找到一个干净的方法来检查涉及两个数组的数据时,这个问题就出现了。如果我有zip
,我可以写出类似以下的代码:
zip(a, b).all? {|pair| pair[0] === pair[1]}
如果没有任何类似于 zip
的内容,我也可以接受一种干净的方式来完成这个任务(其中“干净”意味着“没有显式循环”)。
Ruby有一个zip函数:
[1,2].zip([3,4]) => [[1,3],[2,4]]
因此,您的代码示例实际上是:
a.zip(b).all? {|pair| pair[0] === pair[1]}
a.zip(b).all? {|a,b| a === b }
你能不能不这样做:
a.eql?(b)
编辑以添加一个示例:
a = %w[a b c]
b = %w[1 2 3]
c = ['a', 'b', 'c']
a.eql?(b) # => false
a.eql?(c) # => true
a.eql?(c.reverse) # => false
这是来自 Ruby 规范:
it "returns true if other has the same length and each pair of corresponding elements are eql" do
a = [1, 2, 3, 4]
b = [1, 2, 3, 4]
a.should eql(b)
[].should eql([])
end
所以,你应该可以用在你提到的例子中。
如果你不是使用整数,而是自定义对象,我认为你需要重写 eql? 方法。
这个方法的规范在这里:
http://github.com/rubyspec/rubyspec/tree/master/1.8/core/array/eql_spec.rb