Подтвердить что ты не робот

Установите переменную Ruby, если она еще не определена

В Ruby, как вы устанавливаете переменную в определенное значение, если она еще не определена, и оставить текущее значение, если оно уже определено?

4b9b3361

Ответ 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

что все.