Rubyはクラスとオブジェクトに関してかなり一貫しています。ただし、トップレベルのメソッド宣言に関しては、そのルールはどういうわけか壊れています。例えば、
$ puts self # => main
$ puts self.class # => Object
ただし、このmain
オブジェクトのコンテキストで宣言されたメソッドは、クラスのプライベートメソッドとして何らかの形で利用できますObject
。
これについて論理的な説明はありますか?これらのメソッドは「スタンドアロン関数」として表示されるため、これは非常に便利ですが、「それだけ」と同じように解釈すると、通常はクラスのコンテキストでメソッドを定義する必要があるため、他の点では一貫性のあるルールに違反します。それがそのクラスのメソッドであるために。ただし、main
オブジェクトはクラスではなくObject
、クラスでもありません。
私の質問を再構成する: メソッドはどのスコープでrubyのREPL内で宣言されますか?{クラスオブジェクト/オブジェクトメインまたはモジュールカーネル}
REPLで宣言されたメソッドのプライベートな性質については、plzは次の例を参照してください。
def my_method # "a method declared in REPL"
puts "method called"
end
# calling my_method in REPL aka top-level scope
my_method # => "method called"
[].my_method # => private method `my_method' called for []:Array (NoMethodError)
Array.my_method # => private method `my_method' called for Array:Class (NoMethodError)
Q:my_methodがクラスObjectの下のプライベートメソッドとして定義されている場合、なぜクラスObjectではなくmainに自己設定されるのですか。誰かがそれがプライベートスコープの下にないと言った場合、なぜ私は上記のエラーが発生するのですか?