Хотя x ||= value
- это способ сказать, «если x содержит значение Фолси, включая ноль (что подразумевается в этой конструкции , если x не определено, поскольку оно появляется в левой части присваивание), присвойте значение х ", он делает именно это.
Это примерно эквивалентно следующему. (Тем не менее, x ||= value
не будет выдавать NameError
, как этот код может , и он всегда будет присваивать значение x
, поскольку этот код этого не делает - дело в том, что x ||= value
работает то же самое для любого значения Falsey в 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?
является запахом кода. Будьте осторожны с питанием. Сделайте разумную вещь: дайте значения переменных, прежде чем пытаться их использовать:)
Удачного кодирования.