2009-11-04 43 views
1

为什么这样工作?我认为这与通过引用/值传递有关,但事实并非如此。它是否与新的块范围有关?Ruby 1.8 vs 1.9 - 破坏性拒绝!运营商

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

回答

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上做同样的事情。

+0

这是第一个。在1.8.7中做'k.to_s',你会没事的。 – 2009-11-04 04:28:36

+0

实际上,我终于开始构建1.9.1p243,它也产生了一个符号,所以它必须是第二种解释:正则表达式现在适用于符号。但正如我们所指出的那样,解决方案也是一样的。 – DigitalRoss 2009-11-04 05:47:15

+0

罗斯先生说得对。 – 2009-11-04 06:03:45

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邮件列表,并查看是否有任何主要的黑客知道发生了什么。