我试图将方法的第一个参数设置为可选,然后是任意数量的参数。例如:
def dothis(value=0, *args)
我遇到的问题是这似乎实际上不可能?当我打电话时,dothis("hey", "how are you", "good")
我希望它将值设置为默认值 0,但它只是在制作value="hey"
. 有没有办法完成这种行为?
我试图将方法的第一个参数设置为可选,然后是任意数量的参数。例如:
def dothis(value=0, *args)
我遇到的问题是这似乎实际上不可能?当我打电话时,dothis("hey", "how are you", "good")
我希望它将值设置为默认值 0,但它只是在制作value="hey"
. 有没有办法完成这种行为?
这在 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"]
这篇文章有点老了,但如果有人正在为此寻找最佳解决方案,我想做出贡献。从 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")
您将需要使用命名参数来完成此操作:
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}
通过使用 value=0,您实际上是在为 value 分配 0。只是为了保留该值,您可以使用上述解决方案,也可以在每次调用此方法 def dothis(value, digit=[*args]) 时简单地使用 value。
未提供参数时使用默认参数。
我遇到了类似的问题,我通过使用解决了这个问题:
def check(value=0, digit= [*args])
puts "#{value}" + "#{digit}"
end
并像这样简单地调用检查:
dothis(value, [1,2,3,4])
您的值将是默认值,其他值属于其他参数。