2009-11-04 28 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郵件列表,並查看是否有任何主要的黑客知道發生了什麼。