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

标签 ruby

我想创建一个需要值的函数,除非它已经创建了一个实例值。但是,我不想让参数默认为 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/

相关文章:

mysql - 授予路径权限

ruby - 如何根据电子邮件地址链接到网络邮件提供商?

ruby - 如何取消长时间运行的 Ruby Net::SSH 命令

ruby - 如何使用 Ruby OpenSSL 验证 X.509 证书?

ruby - 包含一个模块来定义动态类方法

ruby - 如何在 Jupyter notebook 中需要 ruby​​ gems?

ruby-on-rails - Rails - 当我推送到生产环境时我会丢失我的开发数据库吗?

android - 使用 irb() 接口(interface)时出错 - HTTPClient::KeepAliveDisconnected 解析头中 block 中的救援

ruby - 在 Ruby 中读取文本文件会给出错误的输出

ruby - 使用 ruby​​ 压缩时间序列数据流