2010-10-09 10 views
17

Załóżmy, że mam następujący kod Ruby:Ruby: Array zawarte w tablicy, każdy rozkaz

array_1 = ['a', 'b'] 
array_2 = ['a', 'b', 'c'] 

some_function(array_1, array_2) # => True 
some_function(array_2, array_1) # => False 
some_function(['a', 'b'], ['a', 'd']) # => False 
some_function(['x', 'y'], array_2) # => False 

mam dość dużo patrząc na some_function zwraca True jeśli parametr 2 zawiera wszystkie elementów w parametrze 1 .

Odpowiedz

42
def f a,b 
    (a-b).empty? 
end 
+0

Doskonałe. Dzięki wielkie! – Mike

+5

To jest to, co lubię w Ruby - tak zwięzłe, sensowne i czytelne. –

+0

Viva Ruby ...: D –

-2
def f a,b 
    tmp = a.map(|i| b.include?(i)) 
    tmp.include?(false) 
end 
1

z poprzedniego postu,

def f a,b 
    (a-b).empty? 
end 

nie będzie działać zgodnie z oczekiwaniami, na przykład:

a1 = [1, 2, 3, 4, 5, 6, 7, 8, 9] 
a2 = [2, 3, 5, 9] 

(a1-a2).empty? # returns true 

jednak

a1-a2 # returns [1, 4, 6, 7, 8], not empty 

zatem f zwraca false.

Bardziej dokładne rozwiązanie, jeśli chcesz jeden-liner będzie:

def f a,b 
    a&b == b 
end 

a&b zwróci wszystkie elementy, które są zarówno a i b następnie sprawdzamy, czy to jest równe b

Przez wzgląd na wieloznaczności:

def f a,b 
    (a&b == a) || (a&b == b) 
end 
+0

To dlatego, że powinieneś umieścić większą tablicę w pierwszej kolejności. Autor faktycznie pyta, czy tablica 'a' jest podzbiorem' b'. Oczywiście w twoim przykładzie 'a1' nie jest podzbiorem' a2' –

+0

'a1 = [1, 2, 3, 4, 5, 6, 7, 8, 9]'; 'a2 = [2, 3, 5, 9]'; '(a1-a2) .empty?' # => Zwraca 'false' !! ; Czy zrobiłem coś złego lub zrobiłeś? – Djunzu