2009-11-04 5 views
1

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"}] 
# 

Répondre

4

Dans 1.9 expressions régulières peuvent apparemment correspondre à des symboles.

$ ruby -v -e 'puts((:hello =~ /llo/).inspect)' 
ruby 1.8.7 (2008-08-11 patchlevel 72) [i486-linux] 
false 
$ 19/bin/!! 
19/bin/ruby -v -e 'puts((:hello =~ /llo/).inspect)' 
ruby 1.9.1p243 (2009-07-16 revision 24175) [i686-linux] 
2 
$ 

Si vous faites le op avec regex k.to_s il fera la même chose sur 1,8 et 1,9.

+0

C'est le premier. Faites 'k.to_s' en 1.8.7 et tout ira bien. –

+0

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

+0

M. Ross a raison. –

0

Après avoir creusé dans une partie du code C pour les deux versions de Ruby, je n'arrive pas à trouver la différence. Dans Ruby 1.8.7 et 1.9.1, la méthode = ~ n'est pas définie pour Symbol, mais plutôt avec Object. Dans 1.8.7 appeler cette méthode retourne toujours false, alors qu'en 1.9.1 il retourne toujours nil. Quelque chose doit être différent dans la façon dont les symboles de 1.9.1 sont reconnus pour cette opération particulière puisqu'ils sont apparemment de type castés dans Strings.

Ceci est un comportement très étrange car il est complètement non documenté et très différent. Je suggère de prendre la question à la liste de diffusion Ruby Core et voir si l'un des principaux pirates savent ce qui se passe.