Yritän toistaa sellaisen funktion API: n (kirjoitettu R-kirjaimella), joka hyväksyy mielivaltaisen määrän argumentteja ja käsittelee sitä samalla tavalla kuin se käsittelisi yhtä argumenttia, joka on luettelo erilaisista tietojoukoista.
Onko Mathematica-idiooma, jonka avulla funktio voidaan määrittää siten, että:
f[ arg1, arg2, ..., argN ]
käyttäytyy sama kuin
f[ {arg1, arg2, ..., argN} ]
?
Kommentit
Vastaa
Kuten Andy Ross kommentissa kuvailee, voit tehdä määritelmän, joka esikäsittelee argumentit argumentteina kanoniseen muotoon. Kääntämällä esimerkkiään vain havainnollistamaan joustavuutta:
f[{args__}] := f[args] f[args__] := Multinomial[args] / Plus[args] f[{12, 7, 3}] == f[12, 7, 3]
Tosi
Tämä menetelmä on hyödyllinen monimutkaisemmalle esikäsittelylle, mutta tällaisissa yksinkertaisissa tapauksissa on usein helpompaa käyttää Alternatives
:
g[{args__} | args__] := Multinomial[args]/Plus[args] g[{12, 7, 3}] == g[12, 7, 3]
Tosi
Huomaa, että kun Alternatives
-ominaisuuden avulla sinun on manuaalisesti järjestettävä mallit, koska niitä yritetään peräkkäin. Kuvio args__ | {args__}
ei toimisi toivotulla tavalla, koska args__
vastaa {12, 7, 3}
yhtenä argumenttina .
Vastaa
Voit käsitellä tätä monella tapaa. Lähestymistapaa, jonka todennäköisesti käyttäisin, voidaan havainnollistaa seuraavalla esimerkillä:
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" *)
Tietenkin jokainen tämän tekniikan sovellus korvaisi tässä näkyvät merkkijonot joillakin toiminto, joka sopii omiin tarpeisiinsa.
Toinen tapa on kirjoittaa erilliset toiminnot kullekin käsiteltävälle argumenttimallille:
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" *)
Kommentit
- Mikä on perustelusi " todennäköisimmin " käyttämiseen
Switch
useita määritelmiä?Switch
on yleensä hitaampaa eikä sitä tule käyttää ilman syytä, IMHO. - @ Mr.Wizard.
Switch
-sovelluksen käyttö vetoaa mielentilaan ohjelmoinnin estetiikasta, koska se järjestää kaikki vaihtoehdot, jotta ne voidaan käsitellä yhdellä toiminnolla. En ' en yleensä ole kaikkia niitä, jotka ovat huolissaan suorituksen nopeudesta – vasta, kun hidas suoritus tulee todella ilmeiseksi.
f[args___]:= f[{args}]
ja anna määritelmäf[{arg1_, arg2_,...}]
.