@Casper hat Recht. Nur einer der Parameter kann den Splat-Operator haben. Argumente werden den Parametern ohne Spritzer zuerst von links nach rechts zugewiesen. Verbleibende Argumente werden dem Parameter splat zugewiesen.
können Sie tun, was er vorschlagen. Sie können dies auch tun:
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
Hier sind einige Beispiele für irb läuft:
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
Vielleicht, ich hinzufügen sollte. Sie können einen optionalen Parameter als letzten Parameter haben, aber es muss ein Block/proc sein.
Zum Beispiel:
def test(a,*b, &c)
puts a.inspect
puts b.inspect
c.call if not c.nil?
end
Hier sind einige Beispiele für Anrufe:
006 > test(1,2,3)
1
[2, 3]
=> nil
007 > test(1,2,3) {puts "hello"}
1
[2, 3]
hello
=> nil
Welche Version von Ruby verwenden Sie? –
Die Frage ist nicht klar. Wenn Sie 'test (id, hash1)' 'erwarten, erwarten Sie' ary = [hash1]; hash = nil' oder 'ary = []; hash = hash1'? Welche Regel bestimmt, welche ausgewählt wird? – sawa