@Casper ha ragione. Solo uno dei parametri può avere l'operatore splat. Gli argomenti vengono assegnati ai parametri non splattati prima da sinistra a destra. Gli argomenti rimanenti vengono assegnati al parametro splat.
Si può fare come suggerisce. È anche possibile fare questo:
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
Ecco alcune piste IRB campione:
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
Forse, dovrei aggiungere. È possibile avere un parametro opzionale come ultimo parametro, ma deve essere un blocco/proc.
Ad esempio:
def test(a,*b, &c)
puts a.inspect
puts b.inspect
c.call if not c.nil?
end
Ecco alcune chiamate di esempio:
006 > test(1,2,3)
1
[2, 3]
=> nil
007 > test(1,2,3) {puts "hello"}
1
[2, 3]
hello
=> nil
Quale versione di Ruby stai usando? –
La domanda non è chiara. Se esegui 'test (id, hash1)', stai aspettando 'ary = [hash1]; hash = nil' o 'ary = []; hash = hash1'? Qual è la regola che determina quale scegliere? – sawa