无法使用CONSTANT细化String

时间:2014-07-31 14:01:05

标签: ruby

我目前正在探索Ruby 2.1.1中的改进,而且我遇到了奇怪的事情。我正在尝试优化String类并定义一个名为FOO的常量。

sandbox.rb

module Foobar
  refine String do
    FOO = "BAR"

    def foobar
      "foobar"
    end
  end
end

using Foobar

puts "".class::FOO # => uninitialized constant String::FOO (NameError)
puts "".foobar # => "foobar"

这给了我uninitialized constant String::FOO (NameError)。然而,我可以致电"".foobar,这让我相信我在正确的范围内。

奇怪的是,如果我打开String课程并定义FOO,我会得到不同的结果。

sandbox.rb

class String
  FOO = "BAR"
end

puts "".class::FOO # => "BAR"

为什么我没想到这项工作的改进版本?

2 个答案:

答案 0 :(得分:1)

您无法使用优化来细化常量和类变量。

Source: comment by Matz

答案 1 :(得分:0)

免责声明 - 这个答案并没有假装。只是一些研究。

关于refine

refine的想法是对类进行临时的,有限范围的更改。功能是实验性的(Refinements are experimental, and the behavior may change in future versions of Ruby!)有时行为奇怪(就像你的情况一样)。

关于范围:

您在另一个范围内String类常量FOO

=> module Baz
=>   class String
=>     FOO = "ADw"
=>   end
=>   puts "".class::FOO # <- this should work ?
=> end
=> "".class::FOO
#> NameError: uninitialized constant String::FOO
=> Baz::String.new.class::FOO
#> "ADw"
=> String::FOO
#> uninitialized constant String::FOO
=> Baz.constants
#> [:String]

一些更新:

=> module Bar
=>   refine String do
#>     WOO = "Fo"
=>   end
=> end
=> #<refinement:String@Bar>
=> Bar.constants
=> [:WOO]