@Casper 是对的。只有一个参数可以有 splat 运算符。参数首先从左到右分配给非喷溅参数。剩余的参数被分配给 splat 参数。
你可以按照他的建议去做。你也可以这样做:
def test(id,h={},*a)
# do something with id
# if not h.empty? then do something with h end
# if not a.empty? then do something with a end
end
以下是一些示例 irb 运行:
001 > def test (id, h={}, *a)
002?> puts id.inspect
003?> puts h.inspect
004?> puts a.inspect
005?> end
=> nil
006 > test(1,2,3,4)
1
2
[3, 4]
=> nil
007 > test(1,{"a"=>1,"b"=>2},3,4)
1
{"a"=>1, "b"=>2}
[3, 4]
=> nil
008 > test(1,nil,3,4)
1
nil
[3, 4]
=> nil
也许,我应该补充一下。你可以有一个可选参数作为最后一个参数,但它必须是一个块/过程。
例如:
def test(a,*b, &c)
puts a.inspect
puts b.inspect
c.call if not c.nil?
end
以下是一些示例调用:
006 > test(1,2,3)
1
[2, 3]
=> nil
007 > test(1,2,3) {puts "hello"}
1
[2, 3]
hello
=> nil