В рубине Я устал постоянно проверять, если объект имеет все необходимые свойства и подсвойство перед использованием их какЭто хорошая идея использовать method_missing на ноле в рубине
if (obj && obj[:a] && obj[:a][:b] && obj[:a][:b][:c] && obj[:a][:b][:c] > 0)
# do something useful
end
Это хорошее идея избежать этого, указав method_missing
на NilClass
, чтобы вернуть nil
?
class NilClass
def method_missing(method_name, *args, &block)
nil
end
end
Этот способ с правильно написанными сравнениями я могу использовать значения по умолчанию для обработки всего.
Я даже могу сравнить с другими выражениями, как
if (obj[:a][:b][:c] > 0)
# do something useful
else
# default behaviour if obj[:a][:b][:c] <= 0 or obj[:a][:b][:c] is undefined
end
В исключительных случаях я всегда могу вручную проверить nil
.
Что можно сломать?
Выражение «играет с огнем» приходит на ум. Простой пример: '([" chicken "," pig "]. Index (" chikcen ") + 1 == 1)? 1: 2 # => 2'. Здесь ': +' вызывает 'method_missing'. –
Этот контрпример, кажется, не так контр-после ...Похоже, что написано: если есть 'chikcen', тогда возвращайте' 1', в противном случае возвращайте '2', что именно происходит с этим методом. Было бы здорово, если бы вы нашли реальный контрпример. Наверное, тогда мой вопрос станет бессмысленным. – xaxa
Вы согласитесь, что если «цыпленок» не был орфографическим, «1» будет возвращен. Здесь 'index (" chikcen ")' возвращает 'nil',' method missing' заставляет 'nil + 1' возвращать' nil' и 'nil == 1' оценивает' false', поэтому орфографическая ошибка приведет к удивлению на обеденный стол. –