Ruby 如何在vararg列表末尾传递哈希?

Ruby 如何在vararg列表末尾传递哈希?,ruby,Ruby,我有一个函数,它接受一个vararg,该vararg带有一个可选哈希,可以作为最后一项传递: def func(*args) options = args.last.is_a?(Hash) ? args.pop : {} items = args end 如果我有一个数组并且还想传递一个散列,我将如何调用这个函数 x = [ "one", "two", "three" ] .... func(*x, :on => "y

我有一个函数,它接受一个vararg,该vararg带有一个可选哈希,可以作为最后一项传递:

def func(*args)
  options = args.last.is_a?(Hash) ? args.pop : {}
  items = args

end
如果我有一个数组并且还想传递一个散列,我将如何调用这个函数

x = [ "one", "two", "three" ]
....                              
func(*x, :on => "yes")            # doesn't work, i get SyntaxError
SyntaxError消息是:

syntax error, unexpected tSYMBEG, expecting tAMPER
fun(*x, :on => "yes")

我正在运行ruby v1.8.7。

在第一个参数前面不使用
*
调用它

def func(*args)
  options = args.last.is_a?(Hash) ? args.pop : {}
  items = args

  puts "Options: On: #{options[:on]}, Off: #{options[:off]}\n" if options.length > 0
  p args
end

func(x, 123, 'a string', {:on => "yes", :off => "no"})

# Prints:
Options: On: yes, Off: no
[["one", "two", "three"], 123, "a string"]

put
递归地展平传递给它的数组,因此这并不像您想象的那样有效–三个参数仍然都在一个自己的数组中。用
p
而不是
put
@matt尝试一下为什么它们不应该仍然是一个数组?它们作为数组传递,数组是单个参数。输出令人困惑-我将更改调用以包括其他非数组参数,并且在Ruby 1.9中不使用
put
,您可以使用
*
来分解数组。在问题中的示例中,
func(*x,:on=>“yes”)
(其中
x
是一个三元素数组)与向方法传递四个参数相同–如
func('one','two','three',{:on=>“yes”})
。但是,这在1.8.7中不起作用–会出现语法错误。所以这个答案是让它在1.8.7中起作用的一种方法,但是它与你在1.9中可以做的并不完全相同。只是需要注意一下。谢谢你的回复。根据您的示例,我实际需要的输出是:[“一”、“二”、“三”、123、“一个字符串”]——扩展的一二三数组,所有内容都是一个平面数组。在1.8.7。。。