2010-10-05 14 views
11

Chcę, aby jednolinijkowy zwracał wartość true/false, która testuje każdy element w tablicy pod kątem tego, czy jest liczbą całkowitą, czy nie. Więc jeśli dowolny element w tablicy nie jest liczbą całkowitą, powinien zwracać wartość false, w przeciwnym razie true. Oto moja próba:Ruby - przetestuj każdy element tablicy, uzyskaj jeden wynik

>> ([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 

Jakieś inne pomysły na dalszą destylację?

Odpowiedz

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

Perfect, dzięki dużo. – oaklodge

+0

Poczuj się jak magia! – mko

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

Naprawdę chciałbym, żeby Ruby miała lepszą składnię do uzyskiwania dostępu do metod. Jest to bardziej czyste pod względem koncepcyjnym, ale w praktyce jest dłuższe niż pisanie klocka jawnego. – Chuck

+3

@Chuck: Tak. Pojawia się pewien pomysł, który pojawia się co kilka lat, aby lepiej odróżnić operatorów '.' (wysyłanie wiadomości) i' :: '(zakres rozdzielczości). Obecnie '.' oznacza wysyłanie wiadomości i' :: 'oznacza odwołanie zakresu lub wysyłanie wiadomości. Jeśli usuniemy część "lub wysyłającą wiadomość" z '::', możemy rozszerzyć ją tak, aby umożliwić takie rzeczy, jak 'foo :: bar' na określenie' foo.method (: bar) '. Obecnie to nie działa, ponieważ 'foo :: bar' oznacza to samo co' foo.bar'. –

+0

Podoba mi się ten punkt wolny styl .. :) –

Powiązane problemy