仅接受nil参数是设置实例变量

jos*_*osh 2 ruby

我想创建一个需要值的函数,除非它已经创建了一个实例值.但是,我不想在nil默认情况下创建参数,而是希望它优雅地知道它是否需要接受参数.例如,

def config(c)
    @config ||= c
end
Run Code Online (Sandbox Code Playgroud)

@config如果我打电话给它会返回,但是ArgumentError当我试图在没有争论的情况下调用它时会给出一个.我可以使函数不需要参数是实例变量存在吗?

And*_*all 9

Ruby没有提供任何工具来做到这一点,但为什么不自己提升ArgumentError如下:

def config(c = nil)
  raise ArgumentError unless c || @config
  @config ||= c
end
Run Code Online (Sandbox Code Playgroud)

或者,Ruby 2.0提供类似这样的关键字参数:

class A
  def config c: (@config or raise ArgumentError)
    @config = c
  end
end

a = A.new
a.config        #=> ArgumentError
a.config(c: 2)  #=> 2
a.config        #=> 2
Run Code Online (Sandbox Code Playgroud)

当然,也许你真正应该做的只是使用正常的设置方法(即def config=(value) ...)或简单attr_accessor :config.也就是说,至少在你的基本例子中,这是最惯用的方式.