我写了2种方法,一种是三元运算符,另一种是if..else..end。
def test_a()
return (a.blank? or a.body.blank?) ? {} : a.body
end
def test_b()
if a.blank? or a.body.blank?
return {}
else
return a.body
end
end
我认为他们似乎都一样。
但是在RubyMine中,它在a.body
处显示三元警告:
在三元运算符中,零引用可能发生在红宝石中
我使用的语法错误吗?
答案 0 :(得分:1)
不确定红宝石本身,但
会发生通知,因为您在检查a.body.blank?
是否为零之前访问了body
。有些人通过使用a.body && a.body.blank?
来避免这种情况。在ruby 2.3中,此a.body&.blank?
答案 1 :(得分:1)
作为@Stefan的答案:使用||代替or和...
...删除括号应将其修复
def test_a
a.blank? || a.body.blank? ? {} : a.body
end
对于我来说,这是快速正确的答案。在RubyMine中测试。
答案 2 :(得分:0)
您应该可以按照以下方式编写该表达式:
a&.body.presence || {}
a
是nil
,它将返回{}
。a.body
是nil
,它也会返回{}
a.body
为空,它还将返回{}
a.body
,它将返回a.body