2010-10-05 14 views
11

Tek liner'lerin true/false değerini döndürmesini istiyorum. Bu, bir dizideki her bir öğeyi bir Tamsayı olup olmadığını sınar. Yani dizideki herhangi bir öğe bir Tamsayı değilse, yanlış, yanlış olmalıdır. İşte benim denemem:Ruby - her dizi elemanını test edin, bir sonuç alın

>> ([2,1,4].map {|x| (x.is_a? Integer)}).reduce {|x, result| x and result} 
=> true 
>> ([2,"a",4].map {|x| (x.is_a? Integer)}).reduce {|x, result| x and result} 
=> false 

Başka hangi fikirleri daha da düşürmek için?

cevap

19
array.all?{ |x| x.is_a? Integer } 
+0

Mükemmel, teşekkürler ederim. – oaklodge

+0

Büyü gibi hissedin! – mko

5
ary.all?(&Integer.method(:===)) 
+0

Gerçekten Ruby'nin yöntemlere erişmek için daha iyi bir sözdizimi olmasını isterdim. Bu daha kavramsal olarak saftır, ancak pratikte aslında açık bloğu yazmaktan daha uzun. – Chuck

+3

@Chuck: Evet. '.' (Mesaj gönderme) ve ':: (kapsam çözünürlük) operatörleri arasında daha iyi bir fark yaratmak için her iki yılda bir yüzen bir fikir var. Şu anda, '' 'mesaj gönderme anlamına gelir ve' '', kapsam belirleme veya mesaj gönderme anlamına gelir. "Veya" mesajını gönderen kısmı "::' dan kaldırırsak, foo :: bar 'gibi şeyler' foo.method (: bar) 'anlamına gelmesini sağlayacak şekilde genişletebiliriz. Şu anda işe yaramıyor çünkü foo :: bar 'foo.bar' ile aynı anlama geliyor. –

+0

Bu noktayı beğendim özgür stil .. :) –