RUBY proste pytanie o shorthand

0

Mam funkcję która filtruje w ten sposób, że pozostawia liczby nieparzyste


def filter_odd (ary)
    ary.keep_if{|element| element.is_a?(Integer)}
    ary.keep_if{|element| element.odd?}
  end

chciałam zrobić z niej shorthand (nie wiem czy to jest właściwe określenie, ale kod pokazuje o co chodzi

def filter_odd (ary)
   ary.keep_if(&:is_a?(Integer))
  ary.keep_if(&:odd?)
end

I o ile niższy rządek jest OK to wyższy generuje błąd. Niby nawet wiem w którym miejscu - między znakiem zapytania a nawiasem. Pytanie - dlaczego i czy możliwy jest krótki zapis w takiej sytuacji.
I drugie pytanie - czy dwa takie warunki dałoby się połączyć w celu jeszcze większego skrócenia zapisu?

0

Klasa Array, ma trochę wbudowanych funkcji, Użyj select, jeśli nie Chcesz mutować oryginalnej tablicy:

arr = [1, 2, 3, 4, 5 ,6]
arr.select {|n| n.odd?}  #-> [1, 3, 5]

keep_if w przeciwnym przypadku.

0

Zgadza się, ale ja nie mogę poczynić żadnych założeń co do zawartości tablicy (no może poza tym, że jest niepusta).
W tej sytuacji jeżeli tam będzie ułamek, zwrócony zostanie jako liczba nieparzysta co jest niezgodne z oczekiwaniami a string wywoła błąd. Stąd ten pierwszy warunek - którego nie potrafię skrócić

0

To do n.odd? Dodaj logiczne i czy integer.

0
  1. Nie możesz przekazać argumentów do funkcji jeśli używasz &
  2. Jak chcesz to zrobić tak to zrób sobie chain arr.filter { |n| n.is_a?(Integer) }.filter(:odd?)
0

Dzięki, mniej więcej tak to zostanie (tzn z keep_if a nie filter, ale ogólnie w takim łańcuszku).

1 użytkowników online, w tym zalogowanych: 0, gości: 1