Pisząc prezent dla taty z okazji dnia ojca natknąłem się na drobny problem. Tablice w ruby mają cały szereg przydatnych metod dzięki, którym operowanie na tego typu “kolekcjach” jest naprawdę przyjemne (:

Jednak jednej rzeczy mi brakuje (możliwe, że źle szukałem?), otóż klasa Array ma dostępną metodę include? lecz niestety brakuje jej include_all?. Oczywiście można iterować po całej tablicy i wywoływać include? dla każdego elementu jednak wydaje mi się to niezbyt ładnym podejściem.

class Array
    def include_all?(other_array)
        other_array.each do |e|
            return false unless include?(e)
        end
        true
    end
end

Z pomocą przychodzą operacje na zbiorach dostępne dla tablic w ruby. Mowa tu oczywiście o & i |, które odpowiadają za sumę, bądź przecięcie zbiorów.

class Array
    def include_all_set?(other_array)
        self & other_array == other_array
    end
end

a = %w(a b c)
b = %w(b c d)
c = %w(a b c d)

a.include_all_set?(b) => false
c.include_all_set?(a) => true

Ponadto drugi sposób pozwala nam uniknąć rozszerzania klasy Array, dzięki czemu możemy bardzo łatwo sprawdzić czy któraś tablica zawiera wszystkie elementy innej:

a & b == b