2010-04-01 6 views
1

Je suis sûr qu'il me manque quelque chose ici mais néanmoins.Pourquoi ce Ruby 'si' ne se comporte pas comme prévu?

foo['bar'] = nil 

if(foo['bar'] == nil) 
    puts "foo bar is nil :(" 

Cependant, rien ne se passe? Des pensées?

+0

Le problème était avec ruby ​​lui-même (ne va pas dans les détails), mais marqué comme répondu que là où de très bonnes réponses. –

Répondre

10

Vous avez besoin d'une déclaration end fermer votre if-à-dire

if(foo['bar'] == nil) 
    puts "foo bar is nil :(" 
end 

Notez qu'il existe une méthode nil? pour vérifier si quelque chose est nil et les crochets autour de votre état ne sont pas nécessaires pour qu'il serait plus idiomatiques Ruby à écrire:

if foo['bar'].nil? 
    puts "foo bar is nil :(" 
end 

comme Arkku a commenté, une seule ligne if peut être écrit de manière concise comme:

puts "foo bar is nil :(" if foo['bar'].nil? 

Ce qui est préférable dépend du contexte (par ex. voulez-vous souligner la condition ou souligner ce qui se passe si la condition est vraie) et une certaine quantité de préférence personnelle. Mais à titre d'exemple, vous pouvez mettre une condition de garde au début d'une méthode, par ex.

raise "bar needed" if foo['bar'].nil? 
+3

+1, mais comme note additionnelle, dans Ruby, la ligne 'if', que le demandeur aurait voulu abréger, peut être écrite' puts 'nil' si foo ['bar']. Nil? ' – Arkku

+0

@ Arkku Oui, je vais mettre à jour la réponse pour inclure ceci pour l'exhaustivité. – mikej

1
irb(main):002:0> foo = {} 
=> {} 
irb(main):003:0> foo['bar'] = nil 
=> nil 
irb(main):004:0> foo['bar'] 
=> nil 
irb(main):005:0> if foo['bar'] == nil 
irb(main):006:1> puts "foo bar nil" 
irb(main):007:1> end 
foo bar nil 
=> nil 
2

est nul traiter exactement comme faux dans un état. Vous n'avez donc pas besoin de tester si votre variable est vraiment nulle.

foo = {} 
foo['bar'] = nil 
puts "foo bar is nil :(" unless foo['bar'] 
puts "foo bar is nil :(" if !foo['bar'] 

En ruby, juste nil et faux retour faux dans l'énoncé de condition.

+1

Bien sûr, il peut parfois être souhaitable de différencier entre zéro et faux, par ex. ici le message imprimé serait faux pour faux, affirmant qu'il était nul. – Arkku

+1

"nil == false" est trompeur parce qu'ils ne sont pas égaux. Ruby traite zéro comme un faux résultat conditionnel. –

+0

Oui, vous avez raison, c'est un peu trop – shingara

Questions connexes