2016-09-06 4 views
2

Was mein Wissen über Ruby sagt, ist, dass private Methoden nicht mit expliziten Empfänger sogar self aufgerufen werden können.Private Methoden Aufruf in Ruby

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

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

Wie funktioniert das? Wir können private Methode mit instance_eval aufrufen. Bitte erläutern

+3

Sie expliziten Empfänger nicht hier sehen, nicht wahr? –

+1

Ich bin verwirrt von Ihrer Frage. Sie sagen, private Methoden können nur ohne expliziten Empfänger aufgerufen werden. Sie rufen die private Methode ohne einen expliziten Empfänger auf. Dann sind Sie überrascht, dass Sie eine private Methode ohne einen expliziten Empfänger aufrufen können? –

Antwort

1

Da instance_eval den Block im Rahmen der p ausführt (das heißt, es ist self) und der Aufruf von private_method ist nun ein Anruf mit impliziten Empfänger.

1

Mit Ruby können Sie viele "böse" Dinge tun, die die Kapselung oder das andere Prinzip brechen.

instance_eval Läuft den Block mit self wird p. Und Sie können natürlich private Methoden aufrufen, wenn Sie in der Instanz sind. Sie können sogar Methoden auf diese Weise definieren!

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

Es ist nicht die einzige Möglichkeit, dies zu tun. send auch private Methoden nennen erlaubt:

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

Ja, mit Rubin kannst du alle Prinzipien brechen. Nichts ist heilig. :) –

+0

Ich denke, 'send' sollte nicht erlaubt sein, auf die privaten Methoden zuzugreifen. Alles kann mit senden aufgerufen werden! – mhaseeb

+0

@mhaseeb: werfen Sie einen Blick auf 'public_send'. –