que - ¿Qué es un equivalente de Ruby para el builtin "zip" de Python?
ruby desde java (3)
Ruby tiene una función zip:
[1,2].zip([3,4]) => [[1,3],[2,4]]
entonces tu ejemplo de código es en realidad:
a.zip(b).all? {|pair| pair[0] === pair[1]}
o quizás de manera más sucinta:
a.zip(b).all? {|a,b| a === b }
¿Hay algún equivalente de Ruby para la función zip
integrada de Python? Si no, ¿qué es una forma concisa de hacer lo mismo?
Un poco de contexto: esto surgió cuando estaba tratando de encontrar una manera limpia de hacer un chequeo que involucrara dos arreglos. Si tuviera zip
, podría haber escrito algo como:
zip(a, b).all? {|pair| pair[0] === pair[1]}
También aceptaría una manera limpia de hacer esto sin nada parecido a zip
(donde "limpio" significa "sin un bucle explícito").
Esto es de la especificación 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
Entonces debería funcionar para el ejemplo que mencionaste.
Si no está utilizando números enteros, sino objetos personalizados, creo que necesita anular eql ?.
La especificación para este método está aquí:
http://github.com/rubyspec/rubyspec/tree/master/1.8/core/array/eql_spec.rb
No podrías hacer:
a.eql?(b)
Editado para agregar un ejemplo:
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