3

私はファイルクラスを呼び出す2つのメソッドに出くわしました:Fileそして::File

誰かが私に2つの違いと、2つを使用する別々の理由を説明できますか?

4

2 に答える 2

4

FileFile現在のスコープ内の定数を参照しますが、::File常に を参照しObject::Fileます。

p File
# File

p ::File
# File

module Another
  module File
  end

  p File
  # Another::File

  p ::File
  # File
end

したがって、::はファイル システムのルートに似ており、現在のモジュールは現在のディレクトリに似ています。

現在のレキシカル スコープへのオブジェクト指向アクセスについては、Module.nestingを参照してください。

于 2013-01-11T04:56:14.630 に答える
2

短い名前 ( 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'
于 2013-01-11T04:56:03.933 に答える