私はファイルクラスを呼び出す2つのメソッドに出くわしました:File
そして::File
誰かが私に2つの違いと、2つを使用する別々の理由を説明できますか?
File
はFile
現在のスコープ内の定数を参照しますが、::File
常に を参照しObject::File
ます。
p File
# File
p ::File
# File
module Another
module File
end
p File
# Another::File
p ::File
# File
end
したがって、::
はファイル システムのルートに似ており、現在のモジュールは現在のディレクトリに似ています。
現在のレキシカル スコープへのオブジェクト指向アクセスについては、Module.nestingを参照してください。
短い名前 ( File
) でクラスを参照すると、Ruby は最も近いスコープのクラスを使用します。見て:
module MyModule
class File
def initialize *args; end
end
class Foo
def initialize
@file = File.new
end
attr_accessor :file
end
end
f = MyModule::Foo.new
f.file.class # => MyModule::File
file2 = File.new 'newfile', 'w'
file2.class # => File
したがって、トップレベルのコードFoo
とは異なります。File
ただし、Foo
このコードを使用する場合:
@file = ::File.new
次に、ローカルではなく「グローバル」File
クラスを使用しMyModule
ます。同様の方法MyModule::File
で、トップレベルで使用できます
file2 = MyModule::File.new 'newfile', 'w'