在调用方法之前检查nil对象的更好方法是什么?

Eth*_*han 6 ruby ruby-on-rails

我有这个方法调用我必须使用...

financial_document.assets.length
Run Code Online (Sandbox Code Playgroud)

financial_document.assets可能是nil.

我可以用......

financial_document.assets.nil? ? '0' : financial_document.assets.length
Run Code Online (Sandbox Code Playgroud)

有没有那么重复的方法呢?

Joe*_*dor 8

Dave W. Smith走在正确的轨道上.

看看这个:http://www.nach-vorne.de/2007/4/24/attr_accessor-on-steroids

一个简单的解决方案看起来像这样:

class FinancialDocument
  attr_accessor :assets
  def assets
    @assets ||= Array.new
  end
  ...
end
Run Code Online (Sandbox Code Playgroud)


Dav*_*ith 7

处理此问题的重复性较低的方法是确保financial_document.assets始终是非null对象,方法是将其设置为保存适当的sentinel值(例如,空集合或具有退化行为的特殊对象).

请参见Null对象模式.


Jon*_*ski 7

就个人而言,我会使用oroperator/keyword:

(financial_document.assets or []).length
Run Code Online (Sandbox Code Playgroud)

无论哪种方式,.length都在数组上调用,给你0如果nil.