Ruby 1.8 vs 1.9-破坏性拒绝!操作人员

Ruby 1.8 vs 1.9-破坏性拒绝!操作人员,ruby,arrays,hash,ruby-1.9,Ruby,Arrays,Hash,Ruby 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 => 'o

为什么这样做?我认为这与通过引用/值传递有关,但事实并非如此。它与新的块作用域有关吗

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

在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.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执行regex操作,它将在1.8和1.9上执行相同的操作。

在深入研究了两个版本Ruby的一些C代码之后,我似乎找不到相关的区别。在Ruby 1.8.7和1.9.1中,没有为符号定义=~方法,而是使用Object。在1.8.7中调用该方法总是返回false,而在1.9.1中它总是返回nil。对于这一特定操作,1.9.1中的符号在识别方式上必须有所不同,因为它们显然是按字符串类型铸造的


这是非常奇怪的行为,因为它完全没有文档记录,而且非常不同。我建议将这个问题带到Ruby Core邮件列表,看看是否有任何主要黑客知道发生了什么。

在深入研究了两个版本Ruby的一些C代码后,我似乎找不到相关的区别。在Ruby 1.8.7和1.9.1中,没有为符号定义=~方法,而是使用Object。在1.8.7中调用该方法总是返回false,而在1.9.1中它总是返回nil。对于这一特定操作,1.9.1中的符号在识别方式上必须有所不同,因为它们显然是按字符串类型铸造的


这是非常奇怪的行为,因为它完全没有文档记录,而且非常不同。我建议将这个问题带到Ruby Core邮件列表,看看是否有任何主要黑客知道发生了什么。

这是第一个问题。在1.8.7中做k.to_,你会没事的。事实上,我终于开始构建1.9.1p243,它也会产生一个符号,所以这一定是第二个解释:正则表达式现在可以处理符号。但正如我们所指出的,无论哪种方法,解决方案都是一样的,这是第一种。在1.8.7中做k.to_,你会没事的。事实上,我终于开始构建1.9.1p243,它也会产生一个符号,所以这一定是第二个解释:正则表达式现在可以处理符号。但正如我们所指出的,无论哪种方式,解决方案都是相同的。