如何评估红宝石中的复杂表达?

时间:2014-12-26 07:16:55

标签: ruby

我想转此代码:

if obj[:id]
  begin
    foo = JSON.parse(obj[:foo])
    if ! foo['bar']
      something_is_off = true
    end
  rescue JSON::ParserError
    something_is_off = true
  end
else
  something_is_off = true
end

成为以下类型的东西:

something_is_off = ...

红宝石可以吗?

3 个答案:

答案 0 :(得分:1)

喜欢这个

something_is_off = ! obj[:id] or ! begin
                                     foo = JSON.parse obj[:foo]
                                     ! foo['bar']
                                   rescue JSON::ParserError; end

答案 1 :(得分:1)

这就是我的所作所为:

something_is_off = lambda {
  return true unless obj[:id]
  begin
    foo = JSON.parse(obj[:foo])
  rescue JSON::ParserError
    return true
  end
  ! foo['bar']
}.call

答案 2 :(得分:1)

此前的答案绝对正确,没有必要引入新的foo变量:

something_is_off = !(obj[:id] && JSON.parse(obj[:foo])['bar']) rescue true

实际上,当{em> obj 的something_is_off:id评估为true时,obj[:foo]['bar']为false。所以,KISS