Более идиоматичный рубиновый способ написать @var = obj ['blah'], если только obj ['blah']. Nil? - PullRequest
5 голосов
/ 25 июля 2010

Я уверен, что есть более идиоматичный рубиновый способ написания кода ниже:

@var = obj['blah'] unless obj['blah'].nil?

У меня есть целая нагрузка для этого (см. Ниже) и долженлучший способ!

@num_x = obj['num_x'] unless obj['num_x'].nil?
@num_y = obj['num_y'] unless obj['num_y'].nil?
@num_iterations = obj['num_iterations'] unless obj['num_iterations'].nil?
@pe = obj['pe'] unless obj['pe'].nil?

У меня такое ощущение, что оператор ||= может быть полезен, но не может понять, как его использовать.

Ответы [ 4 ]

3 голосов
/ 25 июля 2010

В зависимости от ваших обстоятельств, и если переменные экземпляра уже имеют существующее значение, которое вы хотите сохранить, если значение в obj равно nil, тогда не может быть проблемой просто установить для них значение * 1003.*.

В качестве альтернативы вы можете написать небольшую вспомогательную функцию, например:

def set_instance_variables_for_non_nil_values(h, *keys)
  keys.each do |key|
    instance_variable_set "@#{key}", h[key] unless h[key].nil?
  end
end

Тогда в вашем примере кода вы будете использовать ее следующим образом:

set_instance_variables_for_non_nil_values obj, 'num_x', 'num_y',
  'num_iterations', 'pe'
2 голосов
/ 25 июля 2010

самое короткое, что я могу придумать для этой общей потребности, -

@var = obj['blah'] or @var

хотя, если obj['blah'] может быть false, вам нужно будет использовать исходную версию.

Оператор ||= проверяет левую, а не правую сторону, поэтому здесь не применяется.

1 голос
/ 25 июля 2010

Как это:

obj['blah'] && var = obj['blah']
0 голосов
/ 25 июля 2010

, если @var уже имеет значение, которое не равно nil или false, вы можете использовать

@var &&= obj['blah']

но мне хотелось бы найти более простое решение, возможно, слияние хешей если есть много значений.

, таких как:

obj = {:num_x => 23, :num_y => 75, :pe => 99}

locals = {:num_x => 1, :num_y => 2, :num_iterations => 3, :pe => 4}

puts locals.inspect #=> {:num_y=>2, :pe=>4, :num_iterations=>3, :num_x=>1}

locals.merge! obj

puts locals.inspect #=> {:num_y=>75, :pe=>99, :num_iterations=>3, :num_x=>23}

Который используется для настройки параметров во многих драгоценных камнях, которые я видел.

...