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?

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top