@Casper ma rację. Tylko jeden z parametrów może mieć operatora splat. Argumenty są przypisywane do niepodzielonych parametrów od lewej do prawej. Pozostałe argumenty zostaną przypisane do parametru splat.
Możesz zrobić, jak sugeruje. Można też to zrobić:
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
Oto kilka przykładowych tras 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
Może dodam. Możesz mieć opcjonalny parametr jako ostatni parametr, ale musi to być blok/proc.
Na przykład:
def test(a,*b, &c)
puts a.inspect
puts b.inspect
c.call if not c.nil?
end
Oto niektóre połączenia przykładowe:
006 > test(1,2,3)
1
[2, 3]
=> nil
007 > test(1,2,3) {puts "hello"}
1
[2, 3]
hello
=> nil
Którą wersję Ruby używasz? –
Pytanie nie jest jasne. Jeśli wykonasz 'test (id, hash1)', czy spodziewasz się 'ary = [hash1]; hash = nil' lub 'ary = []; hash = hash1'? Jaka jest reguła, która decyduje o wyborze? – sawa