三元运算符中可能会发生零引用

时间:2019-06-07 06:41:14

标签: ruby-on-rails ruby rubymine

我写了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处显示三元警告:

  

在三元运算符中,零引用可能发生在红宝石中

enter image description here

我使用的语法错误吗?

3 个答案:

答案 0 :(得分:1)

不确定红宝石本身,但

  

nil dereference may occur

会发生通知,因为您在检查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 || {}
  • 如果anil,它将返回{}
  • 如果a.bodynil,它也会返回{}
  • 如果a.body为空,它还将返回{}
  • 如果存在a.body,它将返回a.body