Нулевое разыменование может произойти в троичном операторе - PullRequest
0 голосов
/ 07 июня 2019

Я пишу 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 ]

1 голос
/ 07 июня 2019

Как ответ @ Stefan: Использование || вместо или и ...

... снятие скобок должно исправить

def test_a
  a.blank? || a.body.blank? ? {} : a.body
end

Я думаю, что это быстрый правильный ответ в моем случае. Протестировано в RubyMine.

1 голос
/ 07 июня 2019

не уверен насчет самого rubymine, но может произойти разыменование

nil

уведомление происходит, поскольку вы получаете доступ к a.body.blank? перед проверкойявляется ли body нулем или нет.некоторые избегают этого, используя a.body && a.body.blank?.в ruby ​​2.3 для этого есть короткий синтаксис a.body&.blank?

0 голосов
/ 07 июня 2019

Вы должны написать это выражение следующим образом:

a&.body.presence || {}
  • Если a равно nil, возвращается {}.
  • Если a.body равно nil, оно также вернет {}
  • Если a.body пусто, оно также вернет {}
  • Если присутствует a.body, он вернет a.body
...