Python的“zip”内置函数在Ruby中有什么等效物?

19

是否有Ruby内置的zip函数的等价物?如果没有,有没有一种简洁的方式来做同样的事情?

一些背景信息:当我试图找到一个干净的方法来检查涉及两个数组的数据时,这个问题就出现了。如果我有zip,我可以写出类似以下的代码:

zip(a, b).all? {|pair| pair[0] === pair[1]}

如果没有任何类似于 zip 的内容,我也可以接受一种干净的方式来完成这个任务(其中“干净”意味着“没有显式循环”)。

3个回答

28

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 }

0

你能不能不这样做:

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

我不确定。我需要使用 === 等价运算符来比较元素,而不是 ==。 - Eric Naeseth

-2

这是来自 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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接