【问题标题】:More idiomatic ruby way to write @var = obj['blah'] unless obj['blah'].nil?除非 obj['blah'].nil,否则更惯用的 ruby​​ 方式来编写 @var = obj['blah']?
【发布时间】:2011-03-20 14:19:57
【问题描述】:

我确信有一种更惯用的 ruby​​ 方式来编写下面的代码:

@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?

我感觉||= 运算符可能很有用,但似乎无法完全弄清楚如何使用它。

【问题讨论】:

  • ||= 用于检查变量本身是否为零。你想达到什么目的?如果这些 ivars 为 nil,为什么会有问题?

标签: ruby idioms


【解决方案1】:

根据您的情况,除非实例变量已经有一个您想要保留的现有值,如果 obj 中的值是 nil,那么将它们设置为 @987654323 可能不是问题@。

或者,您可以编写一个小辅助函数,例如:

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】:

对于这种常见需求,我能想到的最短的是

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

虽然如果 obj['blah'] 可以是 false,您需要使用原始版本。

||= 运算符测试左侧,而不是右侧,因此不适用于此处。

【讨论】:

  • 您的代码略有不同:在您的示例中,@var 未更新为obj['blah'] = false。在 OPs 示例中,它总是更新,除了值是 nil
  • @Veger:当然。这就是为什么我提到如果obj['blah'] 可能是假的,你需要原始版本。
  • 啊抱歉,我没注意到!哦,你改变了答案...... :) 现在你总是在更新@var 我不知道它是否非常有效,但它在代码方面被缩短了......
  • @Veger:我改变了其他东西,但那部分从一开始就在那里(条件仍然适用):)
【解决方案3】:

像这样:

obj['blah'] && var = obj['blah']

【讨论】:

    【解决方案4】:

    如果@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}
    

    在我见过的许多 gem 中用于设置选项。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-30
      相关资源
      最近更新 更多