Вызовите функцию несколько раз и получите список результатов - PullRequest
8 голосов
/ 09 января 2012

Я хочу вызвать функцию f 5 раз (например) и получить список результатов. Прямо сейчас у меня есть это:

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

Примечание. Прямо сейчас f - это функция, которая не принимает ввода и возвращает true или false. Поэтому, когда это будет выполнено, я получу список из 5 true / false значений.

Есть ли лучший способ сделать это, используя другие встроенные функции (возможно, reduce? У меня была такая идея, но я не могу понять, как ее использовать ...)

Ответы [ 4 ]

35 голосов
/ 09 января 2012
5.times.collect { f }

(При условии отсутствия параметров. map - это псевдоним collect; я предпочитаю имя collect при фактическом сборе, поскольку оно кажется более коммуникативным, но YMMV.)

Я также предпочитаю более длинный 5.times вместо (1..5). Это также кажется более коммуникативным: я не «перебираю диапазон», я «делаю что-то пять раз».

IMO, ответ в этом случае немного нелогичный, так как я не запускаю collect пять раз, но collect.5.times { f } не работает, так что мы все равно играем в какую-то ментальную игру.

6 голосов
/ 09 января 2012

Попробуйте блочную форму конструктора Array, если вы хотите увеличить аргументы с нуля:

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]
1 голос
/ 20 ноября 2014

Использовать Array.new с блоком

Array.new(10) { f }

Значение индекса доступно, если вы хотите:

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

Из документов :

[С блоком] создается массив заданного размера. Каждый элемент в этом массиве создается путем передачи индекса элемента в данный блок и сохранения возвращаемого значения.

Это стало возможным с не менее 1,8,7 .

1 голос
/ 10 января 2012

Вы могли бы просто сократить свой код, не помещая to_a ... (1..5) в перечисляемое значение, поэтому оно работает с картой.

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

...