2012-01-09 36 views
6

Tôi muốn gọi hàm f 5 lần (ví dụ) và nhận danh sách kết quả. Ngay bây giờ tôi có điều này:Gọi hàm nhiều lần và nhận danh sách kết quả

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

Lưu ý: Ngay bây giờ f là một hàm mang theo không có đầu vào và trả về true hoặc false. Vì vậy, khi điều này được thực hiện chạy, tôi nhận được một danh sách các giá trị 5 true/false.

Có cách nào tốt hơn để làm điều này sử dụng khác được xây dựng trong các chức năng (có thể reduce? Tôi có ý tưởng đó, nhưng không thể tìm ra cách để sử dụng nó ...)

Trả lời

31
5.times.collect { f } 

(Giả sử không có thông số. map là một bí danh để collect; tôi thích tên collect khi thực sự thu vì nó dường như giao tiếp nhiều hơn, nhưng YMMV)

tôi cũng thích còn 5.times thay vì (1..5).. Điều này cũng có vẻ giao tiếp hơn: Tôi không thực sự "lặp lại trên một phạm vi", tôi đang "làm một cái gì đó năm lần".

IMO câu trả lời hơi phản trực quan trong trường hợp này, vì tôi không thực sự chạy collect năm lần, nhưng collect.5.times { f } không hoạt động, vì vậy chúng tôi vẫn chơi trò chơi trí tuệ.

+0

wow ... làm cách nào tôi bỏ lỡ điều đó! cảm ơn @Dave Newton, chính xác những gì tôi đang tìm kiếm. – trh178

3

Hãy thử hình thức khối nhà xây dựng Mảng nếu bạn muốn không dựa lập luận tăng:

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

Bạn chỉ có thể rút ngắn mã của bạn bằng cách không đặt to_a ... (1..5) là một đếm được nên nó hoạt động với bản đồ.

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

1

Sử dụng Array.new với một khối

Array.new(10) { f } 

Giá trị chỉ số có sẵn nếu bạn muốn nó:

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

From the docs:

[Với ab khóa], một mảng của kích thước đã cho được tạo. Mỗi phần tử trong mảng này được tạo bằng cách chuyển chỉ mục của phần tử đến khối đã cho và lưu trữ giá trị trả lại.

Điều này có thể thực hiện được kể từ at least 1.8.7.

Các vấn đề liên quan