Ruby hat viele nette Möglichkeiten, das Ergebnis zu wiederholen und direkt zurückzusenden. Dies betrifft hauptsächlich Array-Methoden. Zum Beispiel:Was ist der sauberste Weg, um ein Ruby-Array mit einer While-Schleife zu erstellen?
def ten_times_tables
(1..5).map { |i| i * 10 }
end
ten_times_tables # => [10, 20, 30, 40, 50]
Allerdings mag ich manchmal iterieren while
verwenden und direkt die resultierenden Array zurück. Zum Beispiel kann der Inhalt des Arrays vom erwarteten Endwert oder einem Akkumulator oder sogar von Bedingungen außerhalb unserer Kontrolle abhängen.
A (erfundene) Beispiel könnte wie folgt aussehen:
def fibonacci_up_to(max_number)
sequence = [1, 1]
while sequence.last < max_number
sequence << sequence[-2..-1].reduce(:+)
end
sequence
end
fibonacci_up_to(5) # => [1, 1, 2, 3, 5]
Für mich ist diese Art von Ansatz fühlt sich ganz "un-Ruby". Die Tatsache, dass ich ein Array konstruiere, nenne und später zurückgebe, fühlt sich an wie ein Anti-Pattern. Bisher ist die beste, die ich mit oben kommen kann verwendet tap
, aber es fühlt sich immer noch ziemlich eklig (und ziemlich verschachtelt):
def fibonacci_up_to(max_number)
[1, 1].tap do |sequence|
while sequence.last < max_number
sequence << sequence[-2..-1].reduce(:+)
end
end
end
Hat jemand irgendwelche cleveren Lösungen für diese Art von Problem?
Ihr erfundenes Szenario ist, wie Sie sagen, ziemlich ungewöhnlich. Daher sieht der Code zum Erreichen des Ergebnisses auch etwas ungewöhnlich aus. Aber ich sehe nichts besonders falsch mit Ihrer ursprünglichen Herangehensweise oder irgendeine signifikante Möglichkeit, sie zu verbessern. –