Metody 2
Proměnná délka seznamu argumentů, hvězdičkový operátor
Poslední parametr metody může být předcházený hvězdičkou(*), která je někdy nazývaná krycí operátor. Ta signalizuje , že může být do funkce vloženo ještě více paramatrů. Ty parametry jsou sezbírány do jednoho pole, které je vytvořené.
def počítat_hodnotu(x,y,*dalšíHodnoty)
puts dalšíHodnoty
end
počítat_hodnotu(1,2,'a','b','c')
Pro výše uvedený příklad by byl výstup ['', ' b', ' c'].
Hvězdičkový operátor může také předcházet argumentu pole ve volání metody. V tomto případě bude pole rozšířené a hodnoty které byly sezbírány jako kdyby byli oddělené čárkami.
arr = ['a','b',c']
počítat_hodnotu(*arr)
má stejný výsledek jako:
počítat_hodnotu('a','b','c')
Další technika Ruby dovoluje použít Hash při volání funkce, a to vám dává to nejlepší ze všech světů: pojmenované parametry, a proměnnou délku argumentů.
def přijmi_haše( var )
print "dostal:", var.inspect # budete tisknout co dostal
end
přijmi_haše :arg1 => ' dává arg1 ' , :argN => ' dávání argN '
# => dostal:{:argN=>"dává argN", :arg1=>"dávání arg1"}
Vidíte, argumenty přijmi_haše byly shluknuty do jedné haš proměnné. Tato technika je velmi často používána v Rubě On Rails API.
Všimněte si chybějících rodičů kolem argumentů funkce přijmi_haše, uvědomme si, že zde není žádná { } Haš syntaxe kolem :arg1 => ' ... ' kódu. Výše uvedený kód je rovnocenný víc výmluvnému následujícímu:
přijmi_haš( :arg1 => ' dává arg1 ' , :argN => ' dává argN ' ) # výchozí seznam přiložený v rodičích
přijmi_haš( { :arg1 => ' dává arg1 ' , :argN => ' dává argN ' } ) # haš je explicitně vytvořen
Tak a teď, jestli se chystáte donutit kódový blok k tomu, aby fungoval, potřebujete závorky.
přijmi_haš( :arg1 => ' dává arg1 ' , :argN => ' dává argN ' ) { |s| puts s }
přijmi_haš( { :arg1 => ' dává arg1 ' , :argN => ' dává argN ' } ) { |s| puts s }
# druhý řádek je více výmluvný, haš je explicitně vytvořený, ale v podstatě stejný jak výše uvedený
Operátor ampersand
Stejně jako hvězdička, značka(&) může předcházet poslední parametr deklarace funkcí. Toto signalizuje , že funkce očekává kódový blok, který bude vložen. A Proc objekt bude vytvořený a přiřazený do parametru obsahujícího blok "vložen v".
Stejně jako ampersand , Proc má přednost běhěm volání metody a bude nahrazený blokem, který představuje. Výnos pak může být užívaný.
def metoda_volání
yield
end
metoda_volání(&nejakyBlok)