Megpróbálom reprodukálni egy függvény API-ját (R betűvel írva), amely tetszőleges számú argumentumot fogad el, és ugyanúgy kezeli, mint egyetlen olyan argumentumot, amely a különböző adatsorok listája.
Van-e olyan Mathematica idióma, amely lehetővé teszi egy függvény definiálását, hogy:
f[ arg1, arg2, ..., argN ]
viselkedjen ugyanaz, mint
f[ {arg1, arg2, ..., argN} ]
?
Megjegyzések
Válasz
Amint Andy Ross leírta egy megjegyzésben, meghatározhat egy meghatározást, amely az argumentum (oka) t kanonikus formába dolgozza fel. Példáját egyszerűen a rugalmasság szemléltetésére fordítja:
f[{args__}] := f[args] f[args__] := Multinomial[args] / Plus[args] f[{12, 7, 3}] == f[12, 7, 3]
Igaz
Ez a módszer bonyolultabb előfeldolgozáshoz hasznos, de ilyen egyszerű esetekben gyakran könnyebb használni a Alternatives
:
g[{args__} | args__] := Multinomial[args]/Plus[args] g[{12, 7, 3}] == g[12, 7, 3]
Igaz
Ne feledje, hogy amikor A Alternatives
használatával manuálisan kell megrendelnie a mintákat, mert azokat egymás után próbálják ki. A args__ | {args__}
minta nem működne a kívánt módon, mert az args__
egyetlen argumentumként illeszkedik a {12, 7, 3}
.
Válasz
Ezt sokféleképpen lehet kezelni. Az a megközelítés, amelyet nagy valószínűséggel alkalmaznék, a következő példával illusztrálható:
f[seqn : ___] := Module[{args = {seqn}}, Switch[args, {{___}}, "List of args", {_}, "One arg", {_, __}, "Two or more args", {}, "No args" ]] f[{x, y, z}] (* ==> "List of args" *) f[{x}] (* ==> "List of args" *) f[] (* ==> "No args" *) f[x] (* ==> "One arg" *) f[x, y, z] (* ==> "Two or more args" *)
Természetesen ennek a technikának az egyes alkalmazásai az itt látható karakterláncokat helyettesítik a saját igényeinek megfelelő művelet.
Egy másik megközelítés az, hogy különálló függvényeket írunk az egyes kezelni kívánt argumentum mintákhoz:
g[args : {___}] := "List of args" g[] := "No args" g[arg_] := "One arg" g[arg_, rest__] := "Two or more args" g[{x, y, z}] (* ==> "List of args" *) g[{x}] (* ==> "List of args" *) g[] (* ==> "No args" *) g[x] (* ==> "One arg" *) g[x, y, z] (* ==> "Two or more args" *)
Megjegyzések
- Mi az oka annak, hogy " valószínűleg " a
Switch
több meghatározás alatt? ASwitch
általában lassabb, és ok nélkül nem használható, IMHO. - @ Mr.Wizard. A
Switch
használata apellál az én programozási esztétikai érzékemre, mert az összes alternatívát megszervezi, így egyetlen funkcióval kezelhetők. <
általában nem aggódom a végrehajtási sebesség miatt – csak addig, amíg a lassú végrehajtás valóban nyilvánvalóvá nem válik.
f[args___]:= f[{args}]
, majd adja meg af[{arg1_, arg2_,...}]
definíciót.