为什么它按照它的方式工作?我认为它与传递引用/值有关,但事实并非如此。它是否与新的块范围有关?
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"}]
#
答案 0 :(得分:4)
1.9正则表达式显然可以匹配符号。
$ 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
$
如果你使用k.to_s
执行正则表达式操作,它将在1.8和1.9上执行相同的操作。
答案 1 :(得分:0)
在深入研究两个版本的Ruby的一些C代码后,我似乎无法找到相关差异的位置。在Ruby 1.8.7和1.9.1中,=〜方法没有为Symbol定义,而是使用Object定义。在1.8.7中调用该方法总是返回false,而在1.9.1中它总是返回nil。对于这个特定的操作,1.9.1中的符号如何被识别出来必须有所不同,因为它们显然是类型转换为字符串。
这是非常奇怪的行为,因为它完全没有记录并且非常不同。我建议将问题提交给Ruby Core邮件列表,看看是否有任何主要的黑客知道发生了什么。