class Example
private
def example_test
puts 'Hello'
end
end
e = Example.new
e.example_test
これはもちろん機能しません。明示的な受信者 - Example ( e
) のインスタンスを指定したためです。これは「プライベート ルール」に違反しています。
しかし、なぜRubyでこれができないのか理解できません:
class Foo
def public_m
self.private_m # <=
end
private
def private_m
puts 'Hello'
end
end
Foo.new.public_m
public_m
メソッド定義内の現在のオブジェクト(つまりself
) は Foo のインスタンスです。では、なぜ許可されないのでしょうか。self.private_m
それを修正するには、 justに変更する必要がありprivate_m
ます。しかし、なぜこれが異なるのですか? self
Foo のインスタンスではありませんpublic_m
か? そして、裸のprivate_m
電話の受信者は誰ですか? そうではありませんself
- 実際に省略したのは、Ruby がそれを行う (自分自身で private_m を呼び出す) からです。
あまり混乱していないことを願っています。私はまだRubyに慣れていません。
編集:すべての回答ありがとうございます。それらをすべてまとめると、私は(ついに)明白なself
ことを理解することができました(Rubyのようなものを見たことがない人にとってはそれほど明白ではありません). したがって、プライベート メソッドを呼び出したい場合は、2 つのルールがあります:self
暗黙的な受信者でなければならず、その自己は現在のクラスのインスタンスでなければなりません (Example
その場合、これはインスタンス メソッド定義内にある場合にのみ発生します。メソッドの実行)。間違っている場合は修正してください。
class Example
# self as an explicit receiver (will throw an error)
def explicit
self.some_private_method
end
# self as an implicit receiver (will be ok)
def implicit
some_private_method
end
private
def some_private_method; end
end
Example.new.implicit
Google Trail でこの質問を見つけた人へのメッセージ: これは役に立つかもしれません - http://weblog.jamisbuck.org/2007/2/23/method-visibility-in-ruby