Ответ 1
В то время как x ||= value
- это способ сказать "если x содержит значение false, в том числе nil (которое является неявным в этой конструкции, если x не определено, поскольку оно появляется в левой части задания), присвойте значение x", он делает именно это.
Это примерно эквивалентно следующему. (Тем не менее, x ||= value
не будет бросать NameError
, как этот код, и он всегда будет присваивать значение x
, поскольку этот код не имеет значения - точка должна видеть x ||= value
, работает одинаково для любого значения ложности в x, включая значение "по умолчанию" nil
):
if !x
x = value
end
Чтобы узнать, действительно ли переменной не присвоено значение, используйте метод defined?
:
>> defined? z
=> nil
>> z = nil
=> nil
>> defined? z
=> "local-variable"
>> defined? @z
=> nil
>> @z = nil
=> nil
>> defined? @z
=> "instance-variable"
Однако почти в каждом случае использование defined?
является запахом кода. Будьте осторожны с мощностью. Сделайте разумную вещь: задайте значения переменных, прежде чем пытаться их использовать:)
Счастливое кодирование.