2009-09-26 5 views

Répondre

2

Ou simplement ceci:

def title 
    output.data.title rescue nil 
end 
+0

Très succinct, merci! – Jay

+3

Le problème avec cette approche est que, s'il y a quelque chose de mal sur cette chaîne, vous ne le remarquerez pas après qu'il soit trop tard = P – Yaraher

+0

Bien que cela fonctionne bien dans certains cas, c'est un mauvais conseil sans précautions. 'rescue' gère les exceptions, et est par nature beaucoup plus lent –

1
def try_chain 
    yield 
rescue NoMethodError 
    nil 
end 

def title 
    try_chain { output.data.title } 
end 
+0

Bonne réponse, merci! – Jay

0

Thoughtbot vient de parler this on their blog, en utilisant ce qu'ils appellent est un peu profond Nil:

def swallow_nil 
    yield 
rescue NoMethodError 
    nil 
end 

Ainsi, dans leur exemple, ils pourraient faire quelque chose comme:

campaign = swallow_nil { supporter.politician.campaign } 

Ou, dans votre cas,

def title 
    swallow_nil { output.data.title } 
end 

Cependant, sachez que l'un de vos bogues sera également avalé et serait difficile à trouver, spécialement car il piège NoMethodErrors, ce qui serait causé par d'autres parties de votre code (bien que si vous utilisez testing, cela aide beaucoup) .

Une autre approche serait de use andand où votre code serait alors

def title 
    output.andand.data.andand.title 
end 

Pas aussi propre que le swallow_nil un, mais sans doute préférable de ne pas ignorer tout.

+0

Bonne réponse, merci! – Jay

Questions connexes