Wie kann ich benutzerdefinierte Methoden in Ruby ordnungsgemäß verketten?

8

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%     
visBar 08.07.2014, 21:11
quelle

4 Antworten

10

Versuchen Sie, so etwas zu tun?

%Vor%

Für beliebig viele Argumente

%Vor%     
Rustam A. Gasanov 08.07.2014, 21:20
quelle
4

Definieren wir eine Instanz Ihrer Klasse SimpleMath :

%Vor%

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 ).
  • während es OK ist, () nach new hinzuzufügen, wenn new keine Argumente (auch "Parameter" genannt) hat, ist dies optional und wird normalerweise nicht gemacht.
  • Wenn das Schlüsselwort 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 :

%Vor%

Jetzt

%Vor%

Wenn wir jedoch versuchen, ein weiteres add zu verketten, haben wir ein anderes Problem:

%Vor%

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:

%Vor%

Sie können bestätigen, dass diese Methoden der Klasse Fixnum hinzugefügt wurden, indem Sie Folgendes ausführen:

%Vor%

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:

%Vor%

So können wir die Methode add aufrufen, indem Sie sie an beliebige Fixnum -instanz:

senden %Vor%

Versuchen wir nun, add operations zu verketten:

%Vor%

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:

%Vor%

Erfolg! Holen Sie es?

    
Cary Swoveland 09.07.2014 03:55
quelle
1

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%     
doub1ejack 01.02.2016 00:27
quelle
1

Eine andere Möglichkeit besteht darin, eine Pipeline über chainable_methods-Juwel zu erstellen.

Im Artikel

beschrieben %Vor%     
merqlove 30.10.2016 18:19
quelle