Więc wiem o kilku różnych podejść, że znam i chcę odkrywać zalety i wady różnych sposobów na różne kryteria, które są:Długi nil bezpieczna metoda łańcuchy
- czytelność
- wydajność
- łatwość debugowania
- zasady OO (niska i wysoka spójność sprzęgło)
jawnie przy użyciu Sposób próba z aktywnego wsparcia
person.try(:pet).try(:name).try(:upcase)
Stosując ratowanie zero
person.pet.name.upcase rescue nil
Użycie łańcucha & & operatora
person && person.pet && person.pet.name && person.pet.name.upcase
Monkey łatanie klasa obiektu, patrz https://gist.github.com/thegrubbsian/3499234 dla pierwotnego GIST
class Object
def try_all(*methods)
values = [self]
methods.each do |method|
value = values.last.try(method)
return nil if value.nil?
values << value
end
values.last
end
end
person.try_all(:pet, :name, :upcase)
Nie masz zerowe bezpiecznego kodu, zamiast sprawdzania poprawności danych przed wywołaniem kod
#not a good implementation by any means
def person_has_pet_with_name? person
begin
return true if !person.pet.name.nil?
rescue
return false
end
end
person.pet.name.upcase if person_has_pet_with_name?(person)
Czy moja odpowiedź pomogła Ci w jakikolwiek sposób? –
Proszę oznaczyć odpowiedź jako pytanie rozwiązane, jeśli odpowiedziała na twoje pytanie. –