2017-12-28 2 views
-4

Mein Verständnis ist, dass Methode Look-Up die Klasse des Empfängers und die dort definierten Methoden scannt. Wenn es nicht gefunden wird, wird die Hierarchiekette solange verschoben, bis sie gefunden wird. Das passt diesen Fall:Wie funktioniert Methode in Ruby nachschlagen?

class A 
    def hello 
    p 'hello world' 
    end 
end 

A.new.hello 

wo hello in A.new.class definiert ist. Aber es ist nicht die Situation passen, wenn wir eine Methode für ein Objekt aufrufen Class:

class A 
    def self.hello 
    p 'hello world' 
    end 
end 

A.hello 

Dies sollte mit Verfahren A ‚s eigen Klasse verknüpfen hello ->Object ->BasicObject.

Ruby findet die Methode, indem sie auf die Klasse des Empfängers schaut und dann die Leiter nach oben bewegt. Es sollte die Methode A.class, die Class ist, und nie die Methode hello gefunden haben?

+0

@sawa Was ich meinte ist, dass es funktioniert, aber ich bin mir nicht sicher, warum es funktioniert. Der Prozess, durch den ruby ​​eine Methode findet, besteht darin, die Klasse des Objekts zu betrachten und dann die Methode dort zu finden. In meinem zweiten Beispiel ist 'A's Klasse' Class' und dort ist keine 'Hallo' Methode definiert? – yask

+0

@yask Entschuldigung. Ich habe nicht verstanden, was du verlangst. – thesecretmaster

Antwort

1

Die Sache ist A die Eigenklasse ist nichtClass, aber die Klasse abgeleitet von Class:

▶ A.singleton_class 
#⇒ #<Class:A> 
▶ A.singleton_class.instance_methods(false) 
#⇒ [:hello] 
+0

Ah !! Das macht so viel Sinn. Vielen Dank. :) – yask

+0

Ich habe noch eine weitere Frage, können Sie sich https://stackoverflow.com/questions/48004117/how-class-method-look-ups-work-while-inheritance-in-ruby ansehen? – yask

-1

Unter der Annahme, dass Sie Ihr Programm zu beheben - jetzt wäre es nur mit Syntaxfehlern abbrechen - class stattdessen zu verwenden von Class, wie @sawa bereits hingewiesen, der Unterschied zwischen Ihren Beispielen ist dies:

Im ersten Beispiel ist hello als eine Instanzmethode von A definiert, dh jedes Objekt des Typs A hat diese Methode. A.new ist vom Typ A, also wird die Methode ausgeführt. Der Empfänger ist das Objekt A.new. Im zweiten Beispiel ist hello als eine Klassenmethode von A definiert, d. H. Nur das Objekt A selbst (A ist eine Klasse, ist natürlich auch ein Objekt, weil alles ein Objekt ist) enthält die Methode hell. Wenn Sie schreiben A.hello, A ist der Empfänger.

+1

'A' ist in der Tat ein Empfänger, aber die Frage war (wenn ich es richtig geparst :)" welche Klasse die Methode definiert ist. " – mudasobwa