[英]Is there an idiomatic way to specify default values for optional parameters in Ruby?
是否有更简洁和惯用的方法来编写以下代码,用于指定方法的可选参数(在params / options哈希中)的默认值?
def initialize(params={})
if params.has_key? :verbose
@verbose = params[:verbose]
else
@verbose = true # this is the default value
end
end
我想将它简化为这样的东西:
def initialize(params={})
@verbose = params[:verbose] or true
end
几乎可以工作,除了你真的需要使用has_key? :verbose
has_key? :verbose
作为条件,而不是仅仅评估params[:verbose]
,以便涵盖您想要指定值'false'的情况(即,如果您想要传递:verbose => false
作为此示例中的参数)。
我意识到在这个简单的例子中我可以很容易地做到:
def initialize(verbose=false)
@verbose = verbose
end
但是,在我的实际代码中,我实际上有一堆可选参数(除了一些必需的参数),我想把可选的参数放在params散列中,这样我就可以很容易地指定(按名称)少数几个我想要的,而不是必须按顺序列出它们(并且可能必须列出我实际上并不想要的那些)。
一种常见的模式是使用
def foo(options = {})
options = { :default => :value }.merge(options)
end
您最终会将options
作为包含传入值的哈希,并使用默认哈希中的选项作为未提供的选项。
我想你正在寻找这个
params = { :verbose => true }.merge(params)
写这个的另一种方式,更简洁,就是
def foo(options = {})
options.reverse_merge! value1: true, value2: 100
end
这将选项[:value1]设置为true(默认值),除非传入的选项已包含键:value1。 相同:value2
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.