2016-09-06 9 views
2

私の知る限りでは、明示的な受信者でプライベートメソッドを呼び出すことはできませんselfRubyを呼び出すプライベートメソッド

class Private 
    private 
    def private_method(c) 
    puts '#{c}' 
    end 
end 

p = Private.new 
p.instance_eval{ private_method("private method called") } 

これはどのように機能しますか?プライベートメソッドをinstance_evalと呼ぶことができます。 instance_evalpのコンテキストでブロックを実行する(意味は、それがselfある)とprivate_methodへの呼び出しは、現在の暗黙の受信機との通話であるので

+3

ここに明示的な受信者はありませんか? –

+1

私はあなたの質問で混乱しています。プライベートメソッドは、明示的な受信者なしでのみ呼び出すことができます。明示的な受信者なしでプライベートメソッドを呼び出します。次に、明示的な受信者なしでプライベートメソッドを呼び出すことができることに驚いていますか? –

答えて

1

を説明してください。

1

Rubyでは、カプセル化を破るような「厄介な」ことや、他の何らかの原則を実行することができます。

instance_evalselfのブロックがpで実行されます。また、インスタンスに入っているときにプライベートメソッドを呼び出すこともできます。あなたはその方法を定義することさえできます!

class A 
end 
a = A.new 
a.instance_eval{def value; 5; end} 
puts a.value # prints "5" 

これは唯一の方法ではありません。 sendもプライベートメソッドを呼び出すことができます:

class A 
    private 
    def p 
    5 
    end 
end 
a = A.new 
puts a.send(:p) # prints "5" 
+1

ええ、ルビーと一緒にすべての原則を破ることができます。何も神聖なものではありません。 :) –

+0

私は 'send'はプライベートメソッドにアクセスすることを許可すべきではないと思います。すべてがsendで呼び出すことができます! – mhaseeb

+0

@mhaseeb: 'public_send'を見てください。 –

関連する問題