如何在ruby中计算复杂表达式?

如何在ruby中计算复杂表达式?,ruby,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 = ..

我要将此代码转换为:

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 = ...
ruby可以这样做吗?

像这样

something_is_off = ! obj[:id] or ! begin
                                     foo = JSON.parse obj[:foo]
                                     ! foo['bar']
                                   rescue JSON::ParserError; end
以下是我所做的:

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

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

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

实际上,如果并且只有一个obj有一个
:id
,并且
obj[:foo]['bar']
的计算结果为true,那么
关闭的东西是假的。所以,.

你是说
foo['bar']
而不是
field['bar']
?对于Ruby核心团队来说,如何使内联
rescue
只识别特定的异常是一个长期存在的难题。我为此建议了一个新的关键字
resc
,但被拒绝了。您的解决方案牺牲了对
JSON::parserror
的特殊性,这超出了OP要求的简单语法简化。此外,您的解决方案不分配
foo
局部变量。也许询问者的代码依赖于它,稍后…@BorisStitnicky无论是否需要
foo
local,都可以很容易地内联分配:
(foo=JSON.parse(obj[:foo]))['bar']
。为了处理JSON::ParserError
,我删除了注释。问题是“如何关闭代码信息”
“is_off=…
,不需要处理特定的异常。此外,显示的代码提示案例“
obj
没有键
:foo
”应该按照
is\u off=true
的方式处理。不要把它当成个人的事情。这些只是我对重构一个我不知道上下文的代码片段的保留感觉=)嗯,我不明白为什么不需要处理特定的异常。代码在哪里暗示缺少键
:foo
会导致
某些东西ff==true
?无论如何,这些在这里都不重要。@x-yuri我只是猜测
某个东西关闭了
应该是
true
(关闭)默认情况下。如果且仅当我们可以从
json.foo.bar
检索值,且后者的计算结果为false,则应启用该功能。无论是否无法检索值和/或出现问题,都应禁用该功能(关闭)这意味着,没有理由处理特定的异常;任何异常都应该将其设置为
true
(off.),这是由通用
rescue
处理程序实现的。