Was ist der Grund / Geschichte für die # Konvention von Methoden in Ruby zu identifizieren?
-
30-09-2019 - |
Frage
Zum Beispiel habe ich immer gesehen Methoden bezeichnet als String#split
, aber nie String.split
, die etwas mehr logisch erscheint. Oder vielleicht sogar String::split
, weil Sie #split
im Namensraum von String
sein könnte in Erwägung ziehen. Ich habe sogar die Methode allein gesehen, wenn die Klasse wird angenommen, / implizierte (#split
).
Ich verstehe, dass dies die Art und Weise Methoden in ri identifiziert werden. Was war zuerst da?
Ist das unterscheiden, beispielsweise Verfahren von Feldern? Ich habe auch gehört, dass dies unterscheidet Instanzmethoden von Klassenmethoden hilft. Aber wo hat diesen Start?
Lösung
Der Unterschied zeigt an, wie Sie die Methoden zugreifen.
Klassenmethoden die ::
Trennzeichen verwenden diese Nachricht, um anzuzeigen, können auf die Klasse / Modul-Objekt gesendet werden, während Instanzmethoden die #
Trennzeichen verwenden, um anzuzeigen, dass die Nachricht gesendet werden, um ein Instanz-Objekt.
Ich werde die Complex
Klasse (in Ruby 1.9) holen, den Unterschied zu demonstrieren. Sie haben beide Complex::rect
und Complex#rect
. Diese Methoden haben unterschiedliche arity und sie dienen ganz anderen Zwecken. Complex::rect
nimmt eine reale und eine imaginäre Argument, eine neue Instanz des Complex
Rückkehr, während Complex#rect
ein Array der realen und imaginären Komponenten der Instanz zurück.
ruby-1.9.1-p378 > x = Complex.rect(1,5)
=> (1+5i)
ruby-1.9.1-p378 > x.rect
=> [1, 5]
ruby-1.9.1-p378 > x.rect(2, 4) # what would this even do?
ArgumentError: wrong number of arguments(2 for 0)
from (irb):4:in `rect'
from (irb):4
from /Users/mr/.rvm/rubies/ruby-1.9.1-p378/bin/irb:17:in `<main>'
Ich denke, der Grund, dass sie .
als Trennzeichen für alles, was nicht ist, verwenden, dass es eindeutig ist, ob die Methode zu einer Klasse oder eine Instanz gehört. Jetzt, wo ich gewohnt bin Ruby dies zu tun, ich sehe es tatsächlich als Nachteil zu anderen Sprachen Konventionen, um ehrlich zu sein.
Auch dies ist ein wenig von einem völlig anderen Thema von Feldern , da alle Nachrichten, die Sie Nachrichten senden können, sind eigentlich, auch wenn es Aussehen wie ein öffentlich zugänglichen Bereich . Die nächste Sache, die Sie Felder sind Attribute oder Instanzvariablen, natürlich, die mit @
immer vorangestellt werden und nicht direkt von außerhalb der Instanz, es sei denn Du die Vererbung oder Object#instance_variable_get
/ _set
verwenden.
Wie speziell, warum wählten sie ::
und #
? ::
macht Sinn für mich, weil es konventionell Namensräume getrennt, aber #
war wahrscheinlich nur ein Symbol, das nicht in anderer Nomenklatur verwendet wurde und eindeutig als ein Instanz-Methode Separator erkannt werden konnte.
Andere Tipps
Ich verstehe, dass dies die Art und Weise Methoden in ri identifiziert werden. Was war zuerst da?
Ja, das ist, woher es kam. Wenn Sie #
verwenden, automatisch Hyperlinks es Ihre Methoden, so Verweise auf andere Methoden in der Dokumentation begann durch die #
Zeichen voran werden. Siehe hier :
Die Namen der Klassen, Quelldateien, und alle Methodennamen durch ein Hash-Zeichen einen Unterstrich oder voran enthalten, werden aus dem Kommentartext zu ihrer Beschreibung automatisch verlinkt.
Sie können nicht wirklich eine Methode, um diese Art und Weise aufrufen, jedoch. Aber das sollte nicht überraschend; Immerhin <cref ...>
ist eine ungültige Anweisung in C # trotz gültige Dokumentation Tag zu sein.