В Ruby, как вы устанавливаете переменную в определенное значение, если она еще не определена, и оставить текущее значение, если оно уже определено?
Установите переменную Ruby, если она еще не определена
Ответ 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? является запахом кода. Будьте осторожны с мощностью. Сделайте разумную вещь: задайте значения переменных, прежде чем пытаться их использовать:)
Счастливое кодирование.
Ответ 2
@variable ||= "set value if not set"
Итак, переменные false будут переопределены
> @test = true 
 => true 
> @test ||= "test"
 => true 
> @test 
 => nil 
> @test ||= "test"
 => "test" 
> @test = false 
 => false 
> @test ||= "test"
 => "test" 
Ответ 3
Как вы не указали, какую переменную:
v = v
v ||= 1
Не рекомендуется делать это с использованием локальных переменных.
Изменить: На самом деле v = v не требуется
Ответ 4
Немного поздно, но это рабочее решение, которое также не перезаписывает значения ложности (включая nil):
# assuming x is not defined in current scope
!defined?(x) ? x = 42 : nil  # => x == 42
y = false
!defined(y) ? y = 42 : nil   # => x == false
z = nil
!defined(z) ? z = 42 : nil   # => z == nil
Ответ 5
Если переменная не определена (объявлена?), она не существует, и если она объявлена, то вы знаете, как вы ее инициализировали, правильно?
Обычно, если мне просто нужна переменная, использование которой я еще не знаю, то, что я знаю, никогда не будет использоваться в качестве логического --- я инициализирую ее, установив ее значение в nil. Затем вы можете проверить, легко ли это было изменено позже.
x = nil
some code
if x do 
[code that will only run if x has changed]
end
что все.
