2012-01-09 9 views
6

Chcę zadzwonić do funkcji f 5 razy (na przykład) i uzyskać listę wyników. Teraz mam to:Wywołaj funkcję wiele razy i uzyskaj listę wyników

(1..5).to_a.map!{f} 

Uwaga: teraz f to funkcja, która nie bierze wejściowe i zwraca true lub false. Tak więc, gdy jest to wykonywane, otrzymuję listę wartości 5 true/false.

Czy istnieje lepszy sposób to zrobić przy użyciu innych wbudowanych funkcji (ewentualnie reduce? Miałem taki pomysł, ale nie można dowiedzieć się, jak go używać ...)

Odpowiedz

31
5.times.collect { f } 

(Zakładając żadnych parametrów. map jest aliasem do collect; wolę nazwę collect gdy faktycznie odbiorze jak wydaje się bardziej komunikatywny, ale YMMV)

ja też wolę już 5.times zamiast (1..5).. Wydaje się to również bardziej komunikatywne: nie jestem naprawdę "iteracją na odległość", "robię coś pięć razy".

IMO odpowiedź jest lekko sprzeczna z intuicją w tym przypadku, ponieważ nie jestem tak naprawdę uruchomiony pod numerem collect pięć razy, ale collect.5.times { f } nie działa, więc i tak gramy w grę mentalną.

+0

wow ... jak to przegapiłem! dzięki @Dave Newton, dokładnie to, czego szukałem. – trh178

3

Spróbuj formularz blokowy konstruktora Array jeśli chcesz od zera rosnące argumenty:

Array.new(5) {|x| (x+1).to_f} # => [1.0, 2.0, 3.0, 4.0, 5.0] 
Array.new(10) { rand } # => [0.794129655156092, ..., 0.794129655156092] 
0

Można po prostu skrócić swój kod za nie oddanie to_a ... (1..5) jest tak przeliczalny działa z mapą.

(1..5).map!{f}

1

Zastosowanie Array.new z bloku

Array.new(10) { f } 

Wartość indeksu jest dostępna, jeśli chcesz to:

Array.new(10) { |i| f(i) } 

From the docs:

[Z ab lock], tworzona jest tablica o podanym rozmiarze. Każdy element w tej tablicy jest tworzony przez przekazanie indeksu elementu do danego bloku i zapisanie wartości zwracanej.

To było możliwe od at least 1.8.7.