如何在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
处理程序实现的。