2012-01-09 21 views

cevap

31
5.times.collect { f } 

(parametre varsayarsak fonksiyonları inşa Bu kullanan diğer yapmanın daha iyi bir yolu (muhtemelen reduce? Bu fikri vardı ama nasıl kullanılacağını bilemiyorum ...) var mı. mapcollect bir diğer adıdır;., daha iletişimsel görünüyor ymmv)

Ben de yerine (1..5) ait 5.times uzun tercih olarak ben aslında toplama adı collect tercih ederim. Bu da daha iletişimsel görünüyor: Gerçekten “bir aralıkta yineleme” değilim, “beş kez bir şey yapıyorum”.

IMO yanıtı bu durumda biraz sezgisel, çünkü ben gerçekten collect'u beş kez çalıştırmıyorum ama collect.5.times { f } çalışmıyor, bu yüzden biraz zihinsel bir oyun oynuyoruz.

+0

wow ... bunu nasıl özledim! teşekkürler @Dave Newton, tam olarak aradığım şey. – trh178

3

sıfır tabanlı artan argümanları istiyorsanız Array yapıcısının blok formunu deneyin:

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

sadece to_a koyarak değil kodunuzu kısaltabilir ... (1..5) öylesine bir numaralandırılabilirse harita ile çalışır. İstersen bir blokla

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

1

Kullanım Array.new

Array.new(10) { f } 

endeks değeri kullanılabilir o:

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

From the docs:

[ile ab Kilit], verilen boyutun bir dizisi oluşturulur. Bu dizideki her öğe, öğenin dizinini verilen bloğa geçirerek ve dönüş değerini saklayarak oluşturulur.

Bu, at least 1.8.7 tarihinden beri mümkün.

İlgili konular