3

Ruby のすべての「関数」がメソッドである場合、メソッドが呼び出されるオブジェクトを明示的に言及せずにメソッドを呼び出すと、メソッドは誰に送信されますか?

Ruby プログラミング言語の本 (Flanagan & Matsumoto) には、オブジェクトを省略した場合、メソッドは自分自身で呼び出されると書かれています。

したがって、このコードが機能する場合

p "123"

次に、これは機能するはずです

self.p "123"

しかし、そうではありません!

この場合、これをグローバル スコープで実行したので、self がメインで、self.class が Object です。したがって、単純な Object インスタンスで p を呼び出すことはできません (これは理にかなっています)。

オブジェクトには p が宣言されているカーネルが含まれていることを理解しています。インタプリタは、この宣言にアクセスする方法をどのように知っていますか?

4

2 に答える 2

3

実行時のために、Ruby には特別なオブジェクトmain.

すべてのコードがこのオブジェクトのコンテキストで実行されるのは、ある種のトリックです。

putsしたがって、 などのメソッドを入力している場合p、それらはすべてオブジェクトのコンテキストで呼び出され、selfオブジェクトに渡されselfます。

2 つ目は、アクセス制御です。ご存知かもしれませんが、Ruby にはprivate, protectedand public- などのキーワードがあり、それらはすべてオブジェクトのメソッド呼び出しのアクセスを管理します。Rubyは、次のような構造がある場合にのみ、このアクセス制御をチェックしています

<name_of_object>.your_methodself.your_method

だからあなたが入力しているとき

self.p "something"

pメソッドがプライベート メソッドであるため、Ruby はこの呼び出しを拒否します。

于 2013-03-18T19:22:13.073 に答える
0

ユーザーメガが説明したように、これは単にアクセスの問題です。この例は、それを明示的に示しています-

class Object

  def checking
    p self
  end

  private

  def private_checking
    p self
  end

end


checking                  #=>main
self.checking             #=>main

private_checking          #=>main
self.private_checking     #=>NoMethodError
于 2013-03-18T20:05:27.547 に答える