2012-06-27 4 views
0

Можно создать дубликат:
Is there a clean way to avoid calling a method on nil in a nested params hash?
Is there an equivalent null prevention on chained attributes of groovy in ruby?Рубин синтаксический сахар для цепей (! Obj.nil?)

Есть ли синтаксический сахар, в Ruby, которые помогают избежать " undefined метод `xx 'для nil: NilClass", не написав это?

if !something.nil? && !something.very.nil? && !something.very.long.nil? && !something.very.long.to.nil? then 
    if something.very.long.to.write != 0 then 
    ... 
    end 
end 

в Groovy я сделаю это

if(something?.very?.loong?.to?.write != 0) 

Есть эквивалентный синтаксис для Ruby?

+0

Также http://stackoverflow.com/questions/11164004/does-ruby-have-syntax-for-safe-navigation -operator-of-nil-values-like-in-groovy от 4 дней назад –

+0

Спасибо, было сложно найти в тоннах вопросов Ruby ... –

+0

также http://stackoverflow.com/questions/5429790/is -есть-а-чисто путь к избегать-колл-а-метод-на-ноль-в-а-вложенным Params-хэш. В двух словах: 'andand' или' maybe' (ick). – tokland

ответ

1

Это дублированный вопрос, но на данный момент я не могу найти это. Мой путь:

if a = something and a = a.very and a = a.long and a = a.to 
    if a = a.write 
    ... 
    end 
end 
+0

Недостаточно сладкий, мне нужно больше сахара ;-) Groovy 1: Ruby 0 –

+0

ouch, этот «а» может стать настоящим головокружением с некоторыми разрушительными изменениями стоимости :-p – tokland

+0

@tokland Если в последовательности появляется ответная операция, вы может занять 'a.dup' для продолжения. – sawa

0
class Object 
    def try(*a, &b) 
    if a.empty? && block_given? 
     yield self 
    else 
     __send__(*a, &b) 
    end 
    end 
end 

class NillClass 
    def try(*args) 
    nil 
    end 
end 

Тогда в вашем случае

if result = something.try(:very).try(:long).try(:to).try(:write) 
    if result != 0 
    end 
end 
Смежные вопросы