我想创建一个需要值的函数,除非它已经创建了一个实例值。但是,我不想让参数默认为 nil
,而是希望它优雅地知道它是否需要接受一个参数。例如,
def config(c)
@config ||= c
end
如果我调用它,将返回 @config
,但当我尝试不带参数调用它时,将给出一个 ArgumentError
。如果实例变量存在,我可以使函数不需要参数吗?
最佳答案
Ruby 不提供任何工具来执行此操作,但为什么不像这样自己引发 ArgumentError:
def config(c = nil)
raise ArgumentError unless c || @config
@config ||= c
end
或者,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
当然,也许您真正应该做的只是使用普通设置方法(即 def config=(value) ...
)或简单地 attr_accessor :config
.也就是说,至少在您的基本示例中,这是最惯用的方法。
关于ruby - 仅接受 nil 参数是设置了实例变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17561479/