Rubys Selbst vs. Pythons Selbst [Duplikat]

8

Ruby und Python sind ähnliche Sprachen, die beide ein self -Schlüsselwort haben, das in verschiedenen Situationen verwendet wird. Was bedeutet self in jeder Sprache und was sind die Unterschiede?

    
jrdioko 12.07.2011, 22:07
quelle

3 Antworten

9

In Bezug auf Python kann ich dir nichts Neues sagen. Die self wird konventionell als erster Parameter einer Methode übergeben, wie pst sagt. Von Python-Dokumenten

  

Oft wird das erste Argument einer Methode als self bezeichnet. Das ist nichts weiter als eine Konvention: Der Name self hat für Python absolut keine besondere Bedeutung. Beachten Sie jedoch, dass Ihr Code für andere Python-Programmierer weniger lesbar ist, wenn Sie der Konvention nicht folgen, und es ist auch denkbar, dass ein Klassenbrowserprogramm geschrieben wird, das auf einer solchen Konvention beruht.

CRuby (oder "MRI") hat etwas ähnliches, was allerdings unter der Haube passiert. Jede C-Erweiterung kann (Modul / Klasse / Singleton) -Methoden auf einer Ruby-Klasse definieren, indem Sie

verwenden
  • rb_define_method (Instanz)
  • rb_define_singleton_method (Singleton-Klasse)
  • rb_define_module_function (Klasse / Modul)

Die eigentlichen Implementierungsfunktionen nehmen immer VALUE self als ihr erstes Argument in Analogie zum Python-Idiom. self bezieht sich in diesen Fällen auf die Objektinstanz, an die diese bestimmte Nachricht gesendet wurde, d. h. wenn Sie

haben %Vor%

und do_sth würden in C implementiert werden, dann wäre eine entsprechende C-Funktion

%Vor%

Jede solche Implementierung hat , um VALUE (die C-Repräsentation eines Ruby-Objekts) zurückzugeben, was damit zusammenhängt, dass jeder Methodenaufruf oder Nachricht gesendet wurde ( an Smalltalk-Sprache zu halten) hat einen Rückgabewert in Ruby. In Ruby gibt es keine Funktion void .

Obwohl wir self im Low-Level-C-Code hin und her geben müssen, müssen Sie dies nicht im Ruby-Code tun, Ruby kümmert sich darum. Der aktuelle Wert von self wird intern in dem aktuellen Threadkontext gespeichert, der ausgeführt wird, so dass das Vorhandensein von self gewährt wird, die Nachricht "self" wird immer für ein Objekt ausgewertet.

Aufgrund der dynamischen Natur von Ruby ändert sich der tatsächliche Wert dieses Objekts, auf das von self verwiesen wird, mit dem aktuellen Umfang des aktuell interpretierten Codes. Führen Sie dies aus, um selbst zu sehen:

%Vor%

Wenn Sie eine Methode aufrufen / eine Nachricht aus einem beliebigen Kontext an self senden möchten, können Sie dies entweder explizit tun (zB self.method ) oder% code_de% als Empfänger weglassen - dann wird per Konvention der Der implizite Empfänger der Nachricht ist self .

Eine interessante Randnotiz ist Rubys Interpretation von self Methoden, die sich z. aus dem Java-Konzept von private . Rubys private Methoden können nur durch Senden einer Nachricht mit private als impliziter Empfänger, d. H.

, aufgerufen werden %Vor%

funktioniert, während Methode a durch

ersetzt wird %Vor%

würde eine Ausnahme auslösen. Dies impliziert, dass etwas sehr häufig in Java ist

%Vor%

funktioniert nicht in Ruby. Dummes Beispiel, aber nur um den Punkt zu verdeutlichen: In Java können wir auf private Methoden anderer Instanzen der gleichen Klasse zugreifen, dies wäre in Ruby nicht möglich, da wir nur auf private Methoden der aktuellen self zugreifen können.

Um die Dinge noch etwas komplizierter zu machen, ändern die Funktionen self und instance_eval auch den Wert von class_eval während der Ausführung.

    
emboss 13.07.2011, 00:25
quelle
14

Ruby und Python sind eigentlich sehr verschiedene Sprachen (obwohl sie viele Gemeinsamkeiten haben), selbst wenn Ruby eine Syntax hat, die so geschrieben werden kann, dass sie wie Python aussieht (mit end keywords) ; -)

Ruby ist nachrichtenbasiert (es wurde stark von SmallTalk-80 beeinflusst) und "Nachrichten" werden an Objekte gesendet. Ruby unterstützt einen impliziten Empfänger (explizit als self bekannt) für einen bestimmten Bereich. In Ruby self ist keine Variable , sondern ein Ausdruck, der den aktuellen Objektkontext auswertet.

Python ist eigenschaftsbasiert (aus Mangel an einem besseren Begriff, den ich kenne) und ist daher SELF und JavaScript ähnlicher, da Funktionen direkt ausgeführt werden (anstelle von Nachrichten, die übergeben werden). Python hat kein self -Schlüsselwort und es ist lediglich Konvention, dass self als der Name des ersten Parameters einer Methode verwendet wird - so geht Python im aktuellen Objektkontext um.

Glückliche Kodierung.

    
user166390 12.07.2011 22:12
quelle
9

In% Python ist my_instance.a_method(an_argument) nur eine Abkürzung für MyClass.a_method(my_instance, an_argument) . Daher sollte die Definition von MyClass.a_method zwei Parameter haben:

%Vor%

Wie bereits erwähnt, ist die Verwendung des Variablennamens self nur eine Konvention. Du könntest auch

haben %Vor%

und alles würde gleich funktionieren ... aber mach das nicht.

    
mattjbray 12.07.2011 22:26
quelle

Tags und Links