Pourquoi cela fonctionne-t-il comme il le fait? Je pensais que cela avait quelque chose à voir avec le passage par référence/valeur, mais ce n'est pas le cas. Cela a-t-il quelque chose à voir avec les nouvelles étendues de blocs?Ruby 1.8 vs 1.9 - rejet destructeur! opérateur
def strip_ids(array)
array.each{ |row| row.reject! {|k, v| k =~ /_id/ } }
end
class Foo
attr_accessor :array
def initialize
@array = []
@array << { :some_id => 1, :something => 'one' }
@array << { :some_id => 2, :something => 'two' }
@array << { :some_id => 3, :something => 'three'}
end
end
foo = Foo.new
puts strip_ids(foo.array).inspect
puts foo.array.inspect
##########################
#
# Output in ruby 1.8.7
#
# [{:some_id=>1, :something=>"one"}, {:some_id=>2, :something=>"two"}, {:some_id=>3, :something=>"three"}]
#
#
# Output in ruby 1.9.1
#
# [{:something=>"one"}, {:something=>"two"}, {:something=>"three"}]
#
C'est le premier. Faites 'k.to_s' en 1.8.7 et tout ira bien. –
En fait, j'ai finalement réussi à construire le 1.9.1p243 et il donne aussi un symbole, donc ça doit être la deuxième explication: regex travaille maintenant sur les symboles. Mais comme nous l'avons noté, la solution est la même dans les deux cas. – DigitalRoss
M. Ross a raison. –