【问题标题】:Ruby 1.8 vs 1.9 - destructive reject! operatorRuby 1.8 vs 1.9 - 破坏性拒绝!操作员
【发布时间】:2009-11-04 02:50:24
【问题描述】:

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

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

【问题讨论】:

    标签: ruby arrays hash ruby-1.9


    【解决方案1】:

    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.8.7 中执行 k.to_s 就可以了。
    • 实际上,我终于开始构建 1.9.1p243 并且它也产生了一个符号,所以它必须是第二种解释:正则表达式现在适用于符号。但正如我们所指出的,解决方案是相同的。
    【解决方案2】:

    在深入研究了两个版本的 Ruby 的一些 C 代码之后,我似乎无法找到相关差异在哪里。在 Ruby 1.8.7 和 1.9.1 中,=~ 方法不是为 Symbol 定义的,而是为 Object 定义的。在 1.8.7 中调用该方法总是返回 false,而在 1.9.1 中它总是返回 nil。 1.9.1 中的符号在此特定操作中的识别方式肯定有所不同,因为它们显然是类型转换为字符串的。

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

    【讨论】:

      猜你喜欢
      • 2020-10-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-06
      • 2023-03-16
      • 1970-01-01
      • 1970-01-01
      • 2018-06-27
      相关资源
      最近更新 更多