2012-01-09 5 views
6

예를 들어 f 함수를 5 번 호출하고 결과 목록을 가져 오려고합니다.함수를 여러 번 호출하고 결과 목록을 얻으십시오.

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

참고 : 지금은 이것을 가지고 지금 f 더 입력을지지 않습니다 및 true 또는 false을 반환하는 함수입니다. 따라서이 작업이 끝나면 5 true/false 값의 목록을 얻습니다.

답변

31
5.times.collect { f } 

가 (매개 변수를 가정하지 기능 내장이 사용하는 다른 작업을 수행하는 더 좋은 방법은 (아마도 reduce? 난 그런 생각을했지만, 그것을 사용하는 방법을 알아낼 수 없습니다 ...)이있다. mapcollect 별칭이다. 더 소통 보이지만 YMMV)

내가 대신 (1..5)5.times 더 이상을 선호하는 나는 실제로 수집 이름 collect을 선호합니다. 이것은 또한 더 의사 소통하는 것 같습니다 : 나는 "범위를 반복"하지 않는다, 나는 "무언가를 5 번하고있다".

IMO 내가 실제로 collect을 5 번 실행하지 않기 때문에 약간 반 직관적이지만, collect.5.times { f }은 작동하지 않으므로 어쨌든 우리는 약간의 정신 게임을합니다.

+0

와우 ... 어떻게 그리워 했니! 감사합니다 @ 데이브 뉴턴, 정확히 내가 무엇을 찾고 있었는지. – trh178

3

당신이 제로 기반 증가 인수하려면 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] 
0

당신은 단지 to_a을 넣어하지 않음으로써 코드를 단축 할 수있다 (1..5)는 그래서 열거 지도와 함께 작동합니다. 당신이 원하는 경우 블록

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

1

사용 Array.new는

Array.new(10) { f } 

인덱스 값을 사용할 수 있습니다 그것은 :

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

From the docs :

[로 ab 잠금]을 선택하면 지정된 크기의 배열이 만들어집니다. 이 배열의 각 요소는 요소의 인덱스를 지정된 블록에 전달하고 반환 값을 저장하여 만들어집니다.

이것은 at least 1.8.7부터 가능합니다.

관련 문제