Ruby: наиболее сжатый способ использования переменной, если она существует, в противном случае использовать значение по умолчанию - программирование

Ruby: наиболее сжатый способ использования переменной, если она существует, в противном случае использовать значение по умолчанию

В Ruby я пытаюсь написать строку, которая использует переменную, если она была установлена, в противном случае значение по умолчанию имеет значение:

myvar = # assign it to ENV['MY_VAR'], otherwise assign it to 'foobar'

Я мог бы написать этот код следующим образом:

if ENV['MY_VAR'].is_set? #whatever the function is to check if has been set
  myvar = ENV['MY_VAR']
else
  myvar = 'foobar'
end

Но это довольно многословно, и я пытаюсь написать его максимально кратко. Как я могу это сделать?

4b9b3361

Ответ 1

myvar = ENV['MY_VAR'] || 'foobar'

N.B. Это немного некорректно (если хэш может содержать значение nil), но поскольку ENV содержит только строки, он, вероятно, достаточно хорош.

Ответ 2

Самый надежный способ для общего хэша - спросить, есть ли у него ключ:

myvar = h.has_key?('MY_VAR') ? h['MY_VAR'] : 'default'

Если вам не нужны значения nil или false (т.е. вы хотите относиться к ним так же, как "не существует" ), то подход undur_gongor хорош (это также должно быть хорошо, если h ENV):

myvar = h['MY_VAR'] || 'foobar'

И если вы хотите разрешить nil находиться в вашем хеше, но притвориться, что его нет (т.е. значение nil совпадает с "не существует" ), позволяя false в вашем хэше:

myvar = h['MY_VAR'].nil?? 'foobar' : h['MY_VAR']

В конце концов, это действительно зависит от вашего точного намерения, и вы должны выбрать подход, который соответствует вашему намерению. Выбор между if/else/end и ? :, конечно, является вопросом вкуса и "кратким", не означает "наименьшее количество символов", поэтому не стесняйтесь использовать тройной или if блок по желанию.

Ответ 3

hash.fetch(key) { default_value }

Вернет значение, если оно существует, и верните default_value, если ключ не существует.

Ответ 4

Хотя это не относится к конкретному примеру, который вы дали, поскольку вы действительно спрашиваете о хэш-ключах, а не переменных, Ruby действительно дает возможность проверить определение переменной. Используйте ключевое слово defined? (это не метод, а ключевое слово, поскольку ему требуется специальная обработка интерпретатором), например:

a = 1
defined? a
  #=> "local-variable"

@a = 2
defined? @a
  #=> "instance-variable"

@@a = 3
defined? @@a
  #=> "class-variable"

defined? blahblahblah
  #=> nil

Следовательно, вы можете сделать:

var = defined?(var) ? var : "default value here"

Насколько я знаю, это единственный способ, отличный от уродливого блока begin/rescue/end, чтобы определить переменную так, как вы просите, не рискуя NameError. Как я уже сказал, это не относится к хэшам с тех пор:

hash = {?a => 2, ?b => 3}
defined? hash[?c]
  #=> "method"

то есть. вы проверяете, что метод [] определен, а не пара ключей/значений, которые вы используете для доступа.

Ответ 5

myvar = ENV.fetch('MY_VAR') { 'foobar' }

'foobar' является значением по умолчанию, если ENV['MY_VAR'] не установлен.

Ответ 6

Другая возможная альтернатива, которая будет работать, даже если ENV ['MY_VAR'] окажется ложным значением

myvar  = ENV['MY_VAR'].presence || 'foobar'

Ответ 7

Жемчужина спроса, которую я написал, позволяет быть чрезвычайно лаконичным и сухим:

myvar = demand(ENV['MY_VAR'], 'foobar')

Это будет использовать ENV['MY_VAR'] только если он присутствует. Таким образом, он будет отбрасывать его, только если он равен nil, пуст или является строкой только для пробелов, давая вместо этого значение по умолчанию.

Если допустимое значение для ENV['MY_VAR'] является ложным (например, false), или недопустимое значение является правдивым (например, ""), то решения, такие как || не будет работать.

Ответ 8

myvar = ENV['MY_VAR'].is_set? ? ENV['MY_VAR'] : 'foobar'

Таким образом вы сохраняете .is_set? метод.