В 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
что все.