2012-12-19 12 views
36

Olası Çoğalt bir işlev geçmesine nasıl Bu çalışır biliyorum
Shorter way to pass every element of an array to a functionbir bloğun yerine

:

def inc(a) 
    a+1 
end 
[1,2,3].map{|a| inc a} 

ancak Python

, sadece ihtiyaç yazmak için:

map(inc, [1,2,3]) 

veya

[inc(x) for x in [1,2,3]) 

Ben Ruby bir blok yapma adımları atlayabilirsiniz merak ve bunu edildi:

[1,2,3].map inc 
# => ArgumentError: wrong number of arguments (0 for 1) 
# from (irb):19:in `inc' 

Herkes bunun nasıl yapılacağı hakkında fikir var mı?

+0

var http://stackoverflow.com/questions/13834846/shorter-way-to-pass- her element-of-bir-dizi-bir-fonksiyona/13834860 ​​# 13834860 ​​ – oldergod

cevap

57

"Passing Methods like Blocks in Ruby" göre, şöyle bir blok olarak bir yöntemi geçirebilirsiniz: o kendi bloğu haddeleme çok daha iyi eğer

p [1,2,3].map(&method(:inc)) 

dürüst, bilmiyorum. senin yöntem kullandığınız nesnelerin sınıfına tanımlanırsa

, bunu yapabilirdi:

Bu durumda
# Adding inc to the Integer class in order to relate to the original post. 
class Integer 
    def inc 
    self + 1 
    end 
end 

p [1,2,3].map(&:inc) 

Ruby bir örnek yöntemi adı olarak simgeyi yorumlar ve aramayı dener Bu nesne üzerindeki yöntem.


nedeni, Python birinci sınıf nesnesi olarak bir işlev adı geçmesi, ancak Ruby parantez olmadan sıfır bağımsız değişken içeren bir yöntemi çağırmak için izin verdiğinden değil Ruby olduğunu olabilir. Python'un dilbilgisi, parantez gerektirdiği için, bir fonksiyon isminin içinden geçerek argüman içermeyen bir fonksiyonu çağırmak arasındaki olası belirsizlikleri önler.

+0

Ben yazmamamızın başka bir sebebi 'map (: inc)' dir, Ruby ise daha saf bir OO dili. – halfelf

+0

Ack, '&' belirteçini unuttum, üzgünüm. Sabit. –

+3

'Ruby sembolü bir örnek yöntem adı olarak yorumlar ve bu nesnede yöntemi çağırmayı dener. '=> Örnek yönteminden bahsetme doğru değil veya en azından yeterince açık değil. '&', bir Proc olduğu taktirde bir bloğa eklendiğini dönüştürür. Proc değilse, o zaman 'to_proc', bu durumda 'Symbol # to_proc' uygulanır. – sawa

-8
def inc(a) 
    a + 1 
end 

p [1,2,3].map{|a| inc a} 
9

sorunuza cevap vermez ama gerçekten sadece bütün değişkenleri artırmak istiyorsanız, Integer#next

4.next 
#=> 5 

[1,2,3].map(&:next) 
#=> [2, 3, 4]