Установите переменную Ruby, если она еще не определена - PullRequest
41 голосов
/ 13 июля 2011

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

Ответы [ 5 ]

47 голосов
/ 13 июля 2011

Хотя 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? является запахом кода. Будьте осторожны с питанием. Сделайте разумную вещь: дайте значения переменных, прежде чем пытаться их использовать:)

Удачного кодирования.

24 голосов
/ 13 июля 2011
@variable ||= "set value if not set"

Итак, false переменные будут переопределены

> @test = true 
 => true 
> @test ||= "test"
 => true 
> @test 
 => nil 
> @test ||= "test"
 => "test" 
> @test = false 
 => false 
> @test ||= "test"
 => "test" 
7 голосов
/ 13 июля 2011

Поскольку вы не указали, какую переменную:

v = v
v ||= 1

Не рекомендуется делать это с локальными переменными.

Редактировать: На самом делеv = v не требуется

2 голосов
/ 05 сентября 2016

Немного поздно, но рабочее решение, которое также не перезаписывает ложные значения (включая 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
0 голосов
/ 13 июля 2011

Если переменная не определена (объявлена?), То она не существует, и если она объявлена, то вы знаете, как ее инициализировали, верно?

Обычно, если мне просто нужна переменная, использование которой я еще не знаю - я знаю, что никогда не будет использоваться как логическое значение - я инициализирую ее, установив для нее значение nil. Затем вы можете легко проверить, изменилось ли оно позже

x = nil


some code


if x do 
[code that will only run if x has changed]
end

вот и все.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...