2010-09-07 18 views
5

mam hash rubinowy jak ten
h = {"a" => "1", "b" => "", "c" => "2"}
Teraz mam funkcję rubinowy który ocenia ten hash i zwraca true, jeżeli stwierdzi, klucz z pustą wartością. Mam następującą funkcję, która zawsze zwraca wartość true, nawet jeśli wszystkie klucze w tablicy asocjacyjnej nie są pusteSzukaj rubin hash dla wartości pustej

def hash_has_blank(hsh) 
    hsh.each do |k,v| 
    if v.empty? 
     return true 
    end 
    end 
    return false 
end 

Co robię źle tutaj? Proszę o pomoc

Dzięki, abhi

+2

Działa to dobrze dla mnie.Jaki jest przykład hasha, w którym widzisz ten problem (ponieważ twoje "h" ma pustą wartość) – DanSingerman

Odpowiedz

8

Mam nadzieję, że” Gotowi na naukę magii rubinowej. Nie zdefiniowałbym takiej funkcji globalnie, tak jak ty. Jeśli jest to operacja na hash, niż powinna być metoda instancji od klasy Hash można zrobić to tak:

class Hash 
    def has_blank? 
    self.reject{|k,v| !v.nil? || v.length > 0}.size > 0 
    end 
end 

reject powróci nowy hash ze wszystkich pustych strun, a nie będzie to sprawdził, jak duży jest ten nowy skrót.

możliwie bardziej efektywny sposób (nie powinna przechodzić przez całą tablicę):

class Hash 
    def has_blank? 
    self.values.any?{|v| v.nil? || v.length == 0} 
    end 
end 

Ale to nadal będzie przemierzać cały hash, jeśli nie jest pusta wartość

Zmieniłem od empty? do !nil? || length >0, ponieważ nie wiem, jak działa twoja metoda empty.

+1

Niezbyt wydajne jak ty 1) przechodzenie przez cały hasz i 2) niepotrzebne tworzenie innej struktury. –

+0

Masz rację, jeśli zaktualizujesz moją odpowiedź. "include?" nie powinno przechodzić przez cały skrót, jeśli znajdzie jedno wystąpienie zera. Ale jeśli prawie zawsze masz skróty, które nie mają pustych wartości, to nie powinno to mieć żadnego znaczenia, ponieważ aby zwrócić 'false', funkcja MUSI ZAWSZE przechodzić przez cały skrót. – jigfox

+0

Oczywiście każde rozwiązanie powinno przemierzyć cały skrót, gdy nie ma pustych pól. –

17

Spróbuj tego:

def hash_has_blank hsh 
    hsh.values.any? &:empty? 
end 

Lub:

def hash_has_blank hsh 
    hsh.values.any?{|i|i.empty?} 
end 

Jeśli używasz starego 1.8.x Ruby

+4

Możesz zrobić "hsh.each_value.any? &: empty? 'w ruby> = 1.8.7, aby uniknąć wrzucenia go do tablicy. Ale to może mieć znaczenie tylko w przypadku dużych skrótów. –

+0

Zgadzam się z tobą, użycie modułu wyliczającego jest lepsze. – Nakilon

+0

Ostrzeżenie: Spowoduje to wywołanie wartości mieszania, które odpowiadają na metodę "puste?". Na przykład. 'hash_has_blank ({a: []}) == true', które może nie być oczekiwanym zachowaniem. Sugestia @ steenslag może często być bardziej odpowiednia. – Automatico

4

Jeśli chcesz po prostu sprawdzić, czy któryś z tych wartości jest pusty ciąg można zrobić

h.has_value?('') 

ale czynność wydaje się działać prawidłowo.

4

Zastanowiłbym się nad refaktoryzacją domeny twojego modelu. Oczywiście hash reprezentuje coś namacalnego. Dlaczego nie uczynić z tego przedmiotu? Jeśli element może być w pełni reprezentowany przez skrót, możesz chcieć rozszerzyć podklasę. Jeśli jest to bardziej skomplikowane, hash może być atrybutem.

Po drugie, powód, dla którego sprawdzasz puste miejsca, może zostać nazwany, aby lepiej odzwierciedlał twoją domenę. Nie powiedziałeś nam "dlaczego", ale załóżmy, że Twój przedmiot jest ważny tylko wtedy, gdy nie ma żadnych pustych wartości.

class MyItem < Hash 

    def valid? 
    !invalid? 
    end 

    def invalid? 
    values.any?{|i| i.empty?} 
    end 
end 

Chodzi o to, że jeśli potrafisz stworzyć słownik, który ma sens w Twojej domenie, Twój kod będzie czystszy i bardziej zrozumiały. Używanie skrótu jest po prostu środkiem do osiągnięcia celu, a lepiej wykorzystać bardziej opisowe terminy związane z domeną.

Korzystając z przykładu powyżej, byłbyś w stanie zrobić:

my_item = MyItem["a" => "1", "b" => "", "c" => "2"] 

my_item.valid? #=> false 
+0

To jest czystszy sposób robienia tego. Rozwiązanie jigfox robi to dla mnie – eabhvee

+0

Jeśli to był skrypt jednorazowy, to dobrze. Ale w przeglądzie kodu odrzuciłbym łatkę małpy o podstawowej strukturze danych na rzecz prawidłowego modelowania obiektów. –

Powiązane problemy