Was ist der Grund / die Geschichte für die # Konvention, Methoden in Ruby zu identifizieren?

8

Zum Beispiel habe ich immer Methoden gesehen, die als String#split , aber niemals String.split bezeichnet werden, was etwas logischer erscheint. Oder vielleicht sogar String::split , weil Sie #split im Namensraum von String betrachten könnten. Ich habe sogar die Methode alleine gesehen, wenn die Klasse angenommen / impliziert wird ( #split ).

Ich verstehe, dass auf diese Weise Methoden in Ri identifiziert werden. Was kam zuerst?

Soll das zum Beispiel Methoden von Feldern unterscheiden? Ich habe auch gehört, dass dies hilft, Instanzmethoden von Klassenmethoden zu unterscheiden. Aber wo hat das angefangen?

    
Justin L. 26.06.2010, 09:57
quelle

2 Antworten

8

Der Unterschied zeigt an, wie Sie auf die Methoden zugreifen.

Klassenmethoden verwenden das Trennzeichen :: , um anzugeben, dass eine Nachricht an das Klassen- / Modulobjekt gesendet werden kann, während Instanzmethoden das Trennzeichen # angeben dass die Nachricht an ein Instanzobjekt gesendet werden kann.

Ich werde die Klasse Complex (in Ruby 1.9) auswählen, um den Unterschied zu demonstrieren. Sie haben sowohl Complex::rect als auch Complex#rect . Diese Methoden sind unterschiedlich und dienen ganz anderen Zwecken. Complex::rect verwendet ein reelles und ein imaginäres Argument und gibt eine neue Instanz von Complex zurück, während Complex#rect ein Array der realen und imaginären Komponenten der Instanz zurückgibt.

%Vor%

Ich denke, der Grund, warum sie . nicht als Trennzeichen für alles verwenden, ist, dass es mehrdeutig wäre, ob die Methode zu einer Klasse oder einer Instanz gehört. Nun, da ich es gewohnt bin, dass Ruby dies tut, sehe ich es tatsächlich als einen Nachteil der Konventionen anderer Sprachen, um ehrlich zu sein.

Dies ist auch ein Thema, das völlig unabhängig von Feldern ist, da alle Nachrichten, die Sie senden können, Nachrichten sind, auch wenn sie wie ein öffentlich zugängliches Feld aussehen . Die am nächsten kommenden Felder sind natürlich Attribute oder Instanzvariablen, denen immer @ vorangestellt ist und die nicht direkt von außerhalb der Instanz zugänglich sind, es sei denn, Sie verwenden Vererbung oder Object#instance_variable_get / _set .

Was ist der Grund, warum sie :: und # gewählt haben? :: ergibt für mich Sinn, weil Namespaces konventionell getrennt wurden, aber # war wahrscheinlich nur ein Symbol, das in keiner anderen Nomenklatur verwendet wurde und eindeutig als Trennzeichen für Instanzmethoden erkannt werden konnte.

    
Mark Rushakoff 26.06.2010, 12:32
quelle
3
  

Ich verstehe, dass auf diese Weise Methoden in Ri identifiziert werden. Was kam zuerst?

Ja, hier kommt es her. Wenn Sie # verwenden, hyperlinkisiert es automatisch Ihre Methoden, sodass Verweisen auf andere Methoden in der Dokumentation das Präfix # vorangestellt wird. Siehe hier :

  

Namen von Klassen, Quelldateien und beliebigen Methodennamen, die einen Unterstrich enthalten oder denen ein Hash-Zeichen vorangestellt ist, werden automatisch vom Kommentartext zu ihrer Beschreibung verknüpft.

Sie können eine Methode jedoch nicht auf diese Weise aufrufen. Aber das sollte nicht überraschen. Schließlich ist <cref ...> eine ungültige Anweisung in C #, obwohl es ein gültiges Dokumentations-Tag ist.

    
John Feminella 26.06.2010 12:45
quelle