Почему этот Ruby «если» ведет себя не так, как ожидалось? - PullRequest
1 голос
/ 01 апреля 2010

Я уверен, что что-то здесь упускаю, но тем не менее.

foo['bar'] = nil

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

Однако ничего не происходит? Есть мысли?

Ответы [ 3 ]

10 голосов
/ 01 апреля 2010

Вам нужен оператор end, чтобы закрыть if, т. Е.

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

Обратите внимание, что существует nil? метод для проверки, является ли что-то nil и скобки вокруг вашего условия не нужны, поэтому было бы более идиоматичным Ruby написать:

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

Как прокомментировал Arkku , единственная строка if может быть записана кратко как:

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

Что лучше, зависит от контекста (например, хотите ли вы подчеркнуть условие или подчеркнуть, что происходит, если условие выполняется) и определенного количества личных предпочтений. Но в качестве примера вы можете поставить условие охраны в начале метода, например

raise "bar needed" if foo['bar'].nil?
2 голосов
/ 01 апреля 2010

ноль - относиться к нему как к ложному в условии. Поэтому вам не нужно проверять, действительно ли ваша переменная равна нулю.

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

В ruby ​​просто nil и false возвращают false в условии условия.

1 голос
/ 01 апреля 2010
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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...