Стоит отметить, что! Val.nil? запах кода, указывающий на то, что может быть лучший способ сделать то, что вы пытаетесь сделать; возможно, код полагается на структуру данных, которая может быть заменена чем-то, что могло бы лучше обрабатывать крайние случаи.
Вот пример того, как .nil?
может использоваться плохо:
Например:
blah = {}
[:a,:b,:c,:a].each do |l|
if blah[l].nil?
blah[l] = 0
else
blah[l] += 1
end
end
blah #=> {:a => 2, :b => 1, :c =>1}
Потенциально можно переписать как
blah = Hash.new(0)
[:a,:b,:c,:a].each{|i| blah[i] += 1} #or with inject.
Оператор ||=
- это еще одна область, на которую стоит обратить внимание.
УДАЛЕНО:
Распространенной идиомой для выполнения чего-либо со значением, которое может быть nil, является использование оператора &&, поскольку nil - это ложь, поэтому вместо
if !val.nil?
val.do_something
end
Обычно просто написать
val && val.do_something # =>nil if val is nil, val.do_something's value otherwise
Это требует столько же знаний о том, как nil обрабатывается в логических выражениях, сколько требуется для условного примера mckeed (x, если y), приведенного ниже, так что это на самом деле не помогает коду лучше читать.