Ich fragte diese Art von Frage vor ein paar Tagen und irgendwie kam Kommunikation nicht zustande. Ich habe meine Frage so umstrukturiert, dass wir hoffentlich das Problem lösen können, das ich gelöst habe.So erstellen Sie eine aufzählbare Klasse ohne ein anderes Aufzählungszeichen?
Das Problem besteht im Wesentlichen darin: Wie erstellen Sie eine aufzählbare Klasse, die nicht nur ein anderes Aufzählungszeichen verwendet? Als vereinfachte, aber voll funktionsfähiges Beispiel dafür, was ich tun muss, diese Klasse betrachten:
class MyClass
include Enumerable
def get_next
return_val = rand.to_s
if return_val.match(/33/)
return nil
else
return return_val
end
end
def each
# ??????
end
end
In dieser Klasse berechnet get_next einen Zufallswert. Wenn dieser Wert dann zwei 3 nebeneinander hat, gibt die Methode nil zurück. Andernfalls wird der Wert zurückgegeben. So können Sie get_next überfahren und über, in der Regel für weniger als zehn Mal:
myob = MyClass.new
while not myob.get_next.nil?
puts 'got one'
end
In Wirklichkeit get_next durch Tausende von Datenpunkten sucht. Wenn das nächste Objekt gefunden wird, wird ein ziemlich umfangreiches Objekt zurückgegeben. Es ist unmöglich, dass ein MyClass-Objekt in alle Elemente in einem Array schlüpft. Es muss nur einer nach dem anderen kommen.
In der Tat funktioniert meine Klasse gut, wie oben strukturiert. Ich möchte das jedoch auf eine rubinrische Art und Weise umsetzen.
Geben Sie also in der obigen Arbeitsklasse die Lücken ein. Was würde in jedem() dazu führen, dass dies eine aufzählbare Klasse wird?
Werfen Sie einen Blick auf das Beispiel für ['Enumerator.new'] (http://ruby-doc.org/core-2.4.2/Enumerator.html # method-c-new) - Aufruf von 'take (10)' gibt nur die ersten 10 Elemente zurück, obwohl Zahlen in einer Endlosschleife zurückgegeben werden. Lesenswert: https://blog.arkency.com/2014/01/ruby-to-enum-for-enumerator/ – Stefan