我最近發現Ruby(2.2.1)有一些「有趣」的行爲。Ruby的Object#const_get是如何工作的?
module Foo
class Foo
end
class Bar
end
end
Foo.const_get('Foo') #=> Foo::Foo
Foo.const_get('Bar') #=> Foo::Bar
Foo.const_get('Foo::Foo') #=> Foo
Foo.const_get('Foo::Bar') #=> NameError: uninitialized constant Foo::Foo::Bar
Foo.const_get('Foo::Foo::Bar') #=> Foo::Bar
Foo.const_get('Foo::Foo::Foo::Bar') #=> NameError: uninitialized constant Foo::Foo::Bar
Foo.const_get('Foo::Foo::Foo::Foo::Bar') #=> Foo::Bar
Foo.const_get('Foo::Foo::Foo') #=> Foo::Foo
Foo.const_get('Foo::Foo::Foo::Foo') #=> Foo
Foo.const_get('Foo::Foo::Foo::Foo::Foo') #=> Foo::Foo
Foo.const_get('Foo::Foo::Foo::Foo::Foo::Foo') #=> Foo
這有點令人驚訝。我的理解是,const_get
首先在接收器的常量集合中查找常量,然後查看Object的常量。好的。爲什麼第四個Foo#const_get
失敗,第三個不?
我也很好奇爲什麼調用Foo#const_get
模塊和類之間的交替取決於你添加多少::Foo
。
你可以檢查你的第三個例子('Foo.const_get('Foo :: Foo')')?我只得到'Foo',而不是'Foo :: Foo'。 – matt
@matt你是對的,它只是返回'Foo'。編輯原始問題。 – Huliax