違いはありますか
module Foo
class Engine < Rails::Engine
end
end
と
module Foo
class Engine < ::Rails::Engine
end
end
違いはありますか
module Foo
class Engine < Rails::Engine
end
end
と
module Foo
class Engine < ::Rails::Engine
end
end
Rubyの定数は、ファイルシステムのファイルやディレクトリのようにネストされています。したがって、定数はパスによって一意に識別されます。
ファイルシステムとの類似性を引き出すには:
::Rails::Engine #is an absolute path to the constant.
# like /Rails/Engine in FS.
Rails::Engine #is a path relative to the current tree level.
# like ./Rails/Engine in FS.
考えられるエラーの図を次に示します。
module Foo
# We may not know about this in real big apps
module Rails
class Engine
end
end
class Engine1 < Rails::Engine
end
class Engine2 < ::Rails::Engine
end
end
Foo::Engine1.superclass
=> Foo::Rails::Engine # not what we want
Foo::Engine2.superclass
=> Rails::Engine # correct
Rails::Engine #is a path relative to the current tree level.
# like ./Rails/Engine in FS.
これは完全に真実ではありません!
例を見てみましょう:
module M
Y = 1
class M
Y = 2
class M
Y = 3
end
class C
Y = 4
puts M::Y
end
end
end
# => 3
module M
Y = 1
class M
Y = 2
class C
Y = 4
puts M::Y
end
end
end
# => 2
module M
Y = 1
class M
Y = 2
class M
Y = 4
puts M::Y
end
end
end
# => 4
したがって、M :: Yと言うと、rubyは、現在のスコープ内、外部スコープ、外部外部スコープなどに関係なく、最も近い定義を検索します。