繁体   English   中英

是否有一种惯用的方法来为Ruby中的可选参数指定默认值?

[英]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作为包含传入值的哈希,并使用默认哈希中的选项作为未提供的选项。

Ruby 2.0.0有一个新的特征关键字 参数

以前你必须编写这样的代码:

def foo(options = {})
  options = {bar: 'bar'}.merge(options)
  puts "#{options[:bar]} #{options[:buz]}"
end

foo(buz: 'buz') # => 'bar buz'

现在这更清洁了:

def foo(bar: 'bar', **options)
  puts "#{bar}, #{options}"
end

foo(buz: 'buz') # => 'bar buz'

我想你正在寻找这个

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM