2009-01-07 17 views
13

Kann ich eine private Instanzmethode erstellen, die von einer Klassenmethode aufgerufen werden kann?Aufrufen einer privaten Instanzmethode aus einer Klassenmethode in Ruby

class Foo 
    def initialize(n) 
    @n = n 
    end 
    private # or protected? 
    def plus(n) 
    @n += n 
    end 
end 

class Foo 
    def Foo.bar(my_instance, n) 
    my_instance.plus(n) 
    end 
end 

a = Foo.new(5) 
a.plus(3) # This should not be allowed, but 
Foo.bar(a, 3) # I want to allow this 

Entschuldigung, wenn das eine ziemlich elementare Frage ist, aber ich konnte Google meinen Weg zu einer Lösung nicht.

+0

Sie sollten Ihre Frage beheben, haben Sie einen Tippfehler nutzen könnten. Sind die Methoden Bar oder Plus? – Samuel

+0

Sie haben Recht - wird behoben. Vielen Dank. – user4812

Antwort

17

Verwenden Sie privat oder geschützt wirklich nicht so viel in Ruby. Sie können für jedes Objekt senden und verwenden Sie jede Methode, die es hat. nur auf Objekte der gleichen

class Foo 
    def Foo.bar(my_instance, n) 
    my_instance.send(:plus, n) 
    end 
end 
9

Sie können es tun, wie Samuel zeigte, aber es ist wirklich die OO Kontrollen umgeht ...

In Ruby können Sie nur auf das gleiche Objekt private Methoden senden und geschützt Klasse. Statische Methoden befinden sich in einer Metaklasse und befinden sich daher in einem anderen Objekt (und auch in einer anderen Klasse). Sie können also nicht so verfahren, wie Sie es möchten, entweder privat oder geschützt.

6

Sie auch instance_eval

class Foo 
    def self.bar(my_instance, n) 
    my_instance.instance_eval { plus(n) } 
    end 
end 
Verwandte Themen