Ruby 可选参数和多参数

Posted

技术标签:

【中文标题】Ruby 可选参数和多参数【英文标题】:Ruby Optional Parameters and Multiple Parameters 【发布时间】:2013-02-14 20:23:15 【问题描述】:

我试图将方法的第一个参数设置为可选,后跟任意数量的参数。例如:

def dothis(value=0, *args)

我遇到的问题是这似乎实际上不可能?当我调用 dothis("hey", "how are you", "good") 时,我希望它会将值设置为默认值 0,但实际上它只是在生成 value="hey"。有什么方法可以完成这种行为吗?

【问题讨论】:

投反对票的原因...? 你传递了第一个参数"hey",它被分配给value。因此,默认值无效。它有什么问题? 我想要实现的是保留 value=0 并能够认识到“嘿”是 args 的开始,而不是 value。这是因为我正在调用一个函数,其中大约 90% 的时间值为 0。但每隔一段时间,它就必须是一个。这就是我希望将其用作默认参数的原因。 Ruby 如何知道您传递的第一个参数应该是value 还是args 的第一个元素?你认为 Ruby 能读懂你的想法吗? 这就是问题的重点......是否有其他方法可以实现这种行为,或者是否不可能。我为冒犯你而道歉..不需要敌对。 【参考方案1】:

这在 Ruby 中是不可能的

不过有很多选项,具体取决于您对扩展参数的用途以及该方法的用途。

明显的选择是

1) 使用哈希语法获取命名参数

def dothis params
  value = params[:value] || 0
  list_of_stuff = params[:list] || []

Ruby 有很好的调用约定,你不需要提供哈希 括号

dothis :list => ["hey", "how are you", "good"]

2) 将值移动到末尾,并为第一个参数取一个数组

def dothis list_of_stuff, value=0

这样称呼:

dothis ["hey", "how are you", "good"], 17

3) 使用代码块提供列表

dothis value = 0
  list_of_stuff = yield

这样称呼

dothis  ["hey", "how are you", "good"] 

4) Ruby 2.0 引入了命名散列参数,它为您处理上面的很多选项 1:

def dothis value: 0, list: []
  # Local variables value and list already defined
  # and defaulted if necessary

调用方式与(1)相同:

dothis :list => ["hey", "how are you", "good"]

【讨论】:

感谢您的帮助。 @Kyle,我也喜欢你的解决方案,但我不确定我是否想要大量命名参数,因为在某些情况下,会有很多。但是,我肯定会尝试两种方式,看看我更喜欢哪一种。谢谢大家! @adback03 没问题,反正我更喜欢 Neils 的解决方案 ;)【参考方案2】:

这篇文章有点老了,但如果有人正在为此寻找最佳解决方案,我想做出贡献。 自 ruby​​ 2.0 起,您可以使用散列定义的命名参数轻松完成此操作。语法简单易读。

def do_this(value:0, args:[])
   puts "The default value is still #value"
   puts "-----------Other arguments are ---------------------"
  for i in args
    puts i
  end
end
do_this(args:[ "hey", "how are you", "good"])

你也可以用贪心关键字**args作为哈希做同样的事情,像这样:

#**args is a greedy keyword
def do_that(value: 0, **args)
  puts "The default value is still #value"
  puts '-----------Other arguments are ---------------------'
  args.each_value do |arg|
    puts arg
  end
end
do_that(arg1: "hey", arg2: "how are you", arg3: "good")

【讨论】:

【参考方案3】:

通过使用 value=0,您实际上是在将 0 分配给 value。只是为了保留该值,您可以使用上述解决方案,也可以在每次调用此方法时简单地使用 value def dothis(value, digit=[*args])。

未提供参数时使用默认参数。

我遇到了类似的问题,我通过使用解决了这个问题:

def check(value=0, digit= [*args])
puts "#value" + "#digit"
end 

然后像这样简单地调用检查:

dothis(value, [1,2,3,4])

您的值将是默认值,其他值属于其他参数。

【讨论】:

【参考方案4】:

您需要使用命名参数来完成此操作:

def dothis(args)
  args = :value => 0.merge args
end

dothis(:value => 1, :name => :foo, :age => 23)
 # => :value=>1, :name=>:foo, :age=>23 
dothis(:name => :foo, :age => 23)
 # => :value=>0, :name=>:foo, :age=>23

【讨论】:

以上是关于Ruby 可选参数和多参数的主要内容,如果未能解决你的问题,请参考以下文章

SSRS多值可选

ruby 实现Array#pad和Array#pad!。每个方法都接受最小大小(非负整数)和可选的pad值作为参数。如果是

ruby 实现Array#pad和Array#pad!。每个方法都接受最小大小(非负整数)和可选的pad值作为参数。如果是

Dart语法之可选参数

C#中可选参数和具名参数的使用

Dart 知识点:可选参数必需参数