我目前正在探索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"
为什么我没想到这项工作的改进版本?
答案 0 :(得分:1)
您无法使用优化来细化常量和类变量。
答案 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]