Ich lerne über die Magie von Enumerable in Ruby. Ich habe gehört, dass man Enumerable
nur einschließen und each
Methode implementieren und die Energie von Enumerable für diese Klasse haben kann.implementieren `each` für Enumerable Mixin in Ruby
Also dachte ich über die Implementierung meiner eigenen benutzerdefinierten Klasse Foo für die Praxis. Es sieht aus wie folgt:
class Foo
include Enumerable
def initialize numbers
@num = numbers
end
def each
return enum_for(:each) unless block_given?
@num.each { |i| yield i + 1 }
end
end
Diese Klasse nimmt ein Array und seine each
arbeitet fast ähnlich wie Array#each
. Hier ist der Unterschied:
>> f = Foo.new [1, 2, 3]
=> #<Foo:0x00000001632e40 @num=[1, 2, 3]>
>> f.each { |i| p i }
2
3
4
=> [1, 2, 3] # Why this? Why not [2, 3, 4]?
Alles funktioniert wie ich erwarte, außer einer Sache, die die letzte Aussage ist. Ich weiß es ist der Rückgabewert, aber sollte es nicht [2, 3, 4]
sein. Gibt es eine Möglichkeit, es [2, 3, 4]
zu machen.
Bitte auch Kommentar auf die Art, wie ich each
implementiert habe. Wenn es einen besseren Weg gibt, lass es mich wissen. Zuerst in meiner Implementierung hatte ich diese Zeile return enum_for(:each) unless block_given?
nicht und dann funktionierte es nicht, wenn kein Block zur Verfügung gestellt wurde. Ich habe mir diese Zeile von irgendwo geliehen und bitte sag mir auch, ob das der richtige Weg ist, um mit der Situation umzugehen oder nicht.
Mit yield (i + 1) wenn block_given? 'Ich bekomme ein falsches Ergebnis für jeden – Lokesh
@ Lokesh, vielleicht haben Sie verpasst etwas Code. Bitte, siehe aktuelle Version der Antwort – Ilya
Ich mag Ihre erste Lösung. Die zweite Lösung, die Sie vorgeschlagen haben, die zu initialisieren ist, passt nicht in meine Bedürfnisse, denn statt (i + 1) habe ich etwas ('abc' * i), das den Raum einnimmt, also würde @num vorher ändern auf mehr Platz als nötig. – Lokesh