Ich versuche, eine Verkettungsmethode für die folgenden zwei Methoden durchzuführen. Nachdem ich diesen Code ausgeführt hatte, erhielt ich die folgende Ausgabe:
%Vor% Meine Frage ist: Was ist die richtige Methode zum Verketten von Methoden in Ruby
?
Hier sind meine Codes:
%Vor%Versuchen Sie, so etwas zu tun?
%Vor%Für beliebig viele Argumente
%Vor% Definieren wir eine Instanz Ihrer Klasse SimpleMath
:
Drei Dinge, die hier zu beachten sind:
sm
ist eine Variable. In Ruby werden Variablen durch Kleinbuchstaben dargestellt, optional getrennt durch Unterstriche (z. B. my_var
). ()
nach new
hinzuzufügen, wenn new
keine Argumente (auch "Parameter" genannt) hat, ist dies optional und wird normalerweise nicht gemacht. return
nicht vorhanden ist, gibt Ruby die letzte von der Methode durchgeführte Berechnung zurück. Hier würden Sie in der Regel die letzte Zeile einfach als self
schreiben und diese würde zurückgegeben werden. Ach, das ist nicht wichtig, da die Rückgabe von self
mit oder ohne das Schlüsselwort return
nicht gewünscht ist. Versuchen Sie Folgendes in IRB:
%Vor% Sie haben zweifellos erwartet, dass dies 2+0 #=> 2
zurückgibt, aber stattdessen hat es self
zurückgegeben, was, wie Sie oben sehen können, tatsächlich sm
( #<SimpleMath:0x000001020ca820>
) ist.
Sie können dies beheben, indem Sie einfach die Zeile entfernen:
%Vor% von add
und subtract
:
Jetzt
%Vor% Wenn wir jedoch versuchen, ein weiteres add
zu verketten, haben wir ein anderes Problem:
Diese Nachricht ist sehr klar: Die Klasse Fixnum
, von der 2
eine Instanz ist, hat keine Instanzmethode namens add
. Das liegt daran, dass Sie es für die Klasse SimpleMath
definiert haben, nicht für Fixnum
.
Wenn Ruby sm.add(2).add(3,4)
ausführt, berechnet es zuerst sm.add(2) #=> 2
, wodurch der Ausdruck auf 2.add(3,4)
reduziert wird. Es versucht dann, die Methode add
(mit seinen zwei Parametern) an 2
zu senden, findet aber die Klasse 2.class #=> Fixnum
hat keine Instanzmethode add
; daher die Ausnahme.
Wir können diesen Fehler korrigieren, indem wir diese Methoden stattdessen für die Klasse Fixnum
definieren:
Sie können bestätigen, dass diese Methoden der Klasse Fixnum
hinzugefügt wurden, indem Sie Folgendes ausführen:
Nun, ein weiteres Problem:
%Vor% Oh mein Gott, die Klasse Fixnum
hat keine new
Methode! Das liegt daran, dass die Instanzen von Fixnum
ganze Zahlen sind, die nicht erstellt werden können. Sie können leicht bestätigen, dass Integer Instanzen von Fixnum
sind:
So können wir die Methode add
aufrufen, indem Sie sie an beliebige Fixnum
-instanz:
Versuchen wir nun, add
operations zu verketten:
Keine Ausnahme, aber keine Verkettung. Um das zu beheben, müssen Sie die Methoden noch einmal ändern:
%Vor% Ich habe eine puts
-Anweisung in jeder Methode hinzugefügt, falls mehr Debugging benötigt wird. Wir entfernen diese, wenn der Code ordnungsgemäß funktioniert. Lass uns testen:
Erfolg! Holen Sie es?
Dieser Bursche ( tjackiw.tumblr.com ) verwendet dies als Interviewfrage und gibt einen sehr sauberen Durchlauf wie & amp; Warum ist die richtige Antwort ähnlich der folgenden:
%Vor%Eine andere Möglichkeit besteht darin, eine Pipeline über chainable_methods-Juwel zu erstellen.
beschrieben %Vor%Tags und Links ruby ruby-on-rails methods method-chaining