Ich versuche, eine elegante Methode zum Erstellen einer Liste aus einer Funktion zu erstellen, die Werte in Python und Ruby liefert.Erstellen von Listen mithilfe von Yield in Ruby und Python
In Python:
def foo(x):
for i in range(x):
if bar(i): yield i
result = list(foo(100))
In Ruby:
def foo(x)
x.times {|i| yield i if bar(i)}
end
result = []
foo(100) {|x| result << x}
Obwohl ich in beiden Sprachen liebe die Arbeit, ich habe ein immer etwas von der Version Rubin gestört, die die Liste initialisieren und dann fülle es aus. Pythons yield
ergibt eine einfache Iteration, was großartig ist. Rubys yield
ruft einen Block auf, der auch großartig ist, aber wenn ich nur eine Liste füllen will, fühlt es sich irgendwie klobig an.
Gibt es einen eleganteren Ruby Weg?
UPDATE Das Beispiel wurde überarbeitet, um zu zeigen, dass die Anzahl der Werte, die von der Funktion geliefert werden, nicht unbedingt gleich x ist.
Ruby und Pythons "yield" s sind semantisch unterschiedlich. Die Ausbeute von Python ist fast näher an Rubys Fiber.yield als die Ausbeute von Ruby. – rampion