Er det noen programmeringsspråk med funksjoner med variable argumenter ikke på slutten?

stemmer
1

Python, C ++, Scheme, og andre alt la deg definere funksjoner som tar et variabelt antall argumenter i slutten av argumentet liste ...

def function(a, b, *args):
    #etc...

... som kan kalles som følger:

function(1, 2)
function(1, 2, 5, 6, 7, 8)

osv ... Er det noen språk som tillater deg å gjøre variadic funksjoner med argumentlisten et annet sted? Noe sånt som dette:

def function(int a, string... args, int theend) {...}

Med alle disse gyldige:

function(1, 2)
function(1, a, 3)
function(1, b, c, 4)

Også, hva om valgfritt argumenter hvor som helst i argumentlisten?

def function(int a, int? b, int c, int... d) {}

function(1, 2) //a=1, c=2, b=undefined/null/something, d=[]
function(1,2,3) //a=1, b=2, c=3,d=[]
function(1,2,3,4,5) //a=1, b=2, c=3, d=[4,5]
Publisert på 23/12/2008 klokken 06:19
kilden bruker
På andre språk...                            


8 svar

stemmer
0

Lisp søkeord parametre kan være det du leter etter. Jeg tror det er en tilsvarende ordning i Ruby. Se også Lisp sin funksjon parametere oversikt .

Svarte 23/12/2008 kl. 06:34
kilden bruker

stemmer
0

Jeg antar at PHP teller. Du kan gjøre dette for å simulere det du leter etter. Personlig tror jeg det ville være forvirrende skjønt.

function foo() {
    $args = func_get_args(); // returns an array of args
}
Svarte 23/12/2008 kl. 06:35
kilden bruker

stemmer
2

BASIC har hatt dette i evigheter.

For eksempel:

LOCATE [row%] [,[column%] [,[cursor%] [,start% [,stop%]]]]

Denne kommandoen angir posisjons (rad%, kolonne%) av markøren, samt angivelse av markøren størrelse (start%, stoppe%), og hvorvidt det faktisk er synlig (markør%). Her kan alt i klammer utelates, og hvis det er, er at eiendommen ikke endret.

En bruks eksempel:

LOCATE , 5

for å endre til kolonne 5, eller

LOCATE 1, , 0

til å bevege seg til den første linje, og gjør markøren usynlig.

En annen kommando der dette er sett er PUT kommandoen for å skrive til filer. Hvis midten argument (filen søke stilling) er utelatt deretter skrive oppstår like etter forrige skrive.

Viktigere er argument utelatelse bare sett i innebygde uttalelser, og ikke brukerdefinerte prosedyrer og funksjoner.

Når det gjelder gjennomføring, dette er hva Microsoft Basic-kompilator (BC) ser ut til å gjøre for en samtale for å finne:

  1. For hvert argument:
    • hvis et argument er utelatt, trykk 0
    • hvis et argument tilføres, trykk 1, og deretter skyve den faktiske verdien
  2. Skyv argumentet telle
  3. Ring bibliotek funksjon
Svarte 23/12/2008 kl. 06:39
kilden bruker

stemmer
2

Den neste C ++ kan gjøre det med denne syntaksen:

void f(int a, std::initializer_list<int> b, int c) {
    // b.begin(), b.end(), b.size() allow to access them
}

void g() { 
    f(1, { 2, 3, 4, 5 }, 2);
}
Svarte 23/12/2008 kl. 07:10
kilden bruker

stemmer
1

Flere språk (Perl, Python, mange andre) kan gjøre oppkalt argumenter, som er beslektet med å gjøre valgfrie argumenter overalt i parameterlisten ... (De navngitte parametre kan vises i hvilken som helst rekkefølge, og noen av dem kan gjøres valgfritt .. .) de er strengt tatt ikke det samme, men de er i nærheten av ...

Ikke sikker på om varargs, selv om de kan vanligvis bli erstattet med en rekke / hasj / list objekt ...

Svarte 23/12/2008 kl. 08:58
kilden bruker

stemmer
1

Fremtidige versjoner av Ruby (1.9 og oppover, er Ruby 1,9 planlagt å slippes i slutten av januar, 2009) kan gjøre dette.

Det er imidlertid ikke alltid opplagt hvilken verdi blir bundet til hvilke parameter.

Dette er hva Ruby 1,9 aksepterer:

0 eller flere obligatoriske argumenter, etterfulgt av 0 eller flere valgfrie argumenter, etterfulgt av 0 eller flere obligatoriske argumenter etterfulgt av hvile argumenter, etterfulgt av 0 eller mer obligatoriske argumenter.

Eksempel:

def meth mand1, opt1 = :def1, o2 = :d2, *args, m2, m3
  puts %w[mand1 opt1 o2 m2 args m3].inject('') { |s, arg|
    s << "#{arg} = #{(eval arg).inspect}, "
  }.gsub /, $/, ''
end

meth :arg1, :a2, :a3
# => mand1 = :arg1, opt1 = :def1, o2 = :d2, m2 = :a2, args = [], m3 = :a3
meth :arg1, :a2, :a3, :a4
# => mand1 = :arg1, opt1 = :a2, o2 = :d2, m2 = :a3, args = [], m3 = :a4
meth :arg1, :a2, :a3, :a4, :a5
# => mand1 = :arg1, opt1 = :a2, o2 = :a3, m2 = :a4, args = [], m3 = :a5
meth :arg1, :a2, :a3, :a4, :a5, :a6
# => mand1 = :arg1, opt1 = :a2, o2 = :a3, m2 = :a5, args = [:a4], m3 = :a6
meth :arg1, :a2, :a3, :a4, :a5, :a6, :a7
# => mand1 = :arg1, opt1 = :a2, o2 = :a3, m2 = :a6, args = [:a4, :a5], m3 = :a7

Som du kan se, er obligatoriske argumenter bundet første, fra både venstre og høyre. Da valgfrie argumenter blir bundet og hvis noen argumenter er igjen, får de buntet opp i en matrise og bundet til resten argument.

Svarte 23/12/2008 kl. 16:19
kilden bruker

stemmer
0

R (den statistiske språk) har det også, og det kan være i midten av listen, men det er subtile semantikk.

http://cran.r-project.org/doc/manuals/R-intro.html#The-three-dots-argument

> f1 <- function(x,...,y) {  return(x+y) }
> f1(1,2)
Error in f1(1, 2) : argument "y" is missing, with no default
> f1(1,y=2)
[1] 3
> f1 <- function(x,...,y) {  return(x+y) }
> f1(1,2)
Error in f1(1, 2) : argument "y" is missing, with no default
> f1(1,y=2)
[1] 3
> 
Svarte 22/05/2009 kl. 22:26
kilden bruker

stemmer
0

Det kalles fritid argumenter, og det kan gjøres minst i C ++ og Java. Google "Hvil Argumenter" og du vil finne en masse data om emnet med noen eksempler som funksjoner som vil passere tallene og gå tilbake et gjennomsnitt av tall innspill, kanskje minimum eller maksimum av alle tall passert. Som du ser, det er mange bruksområder for slike funksjoner, jeg brukte den i koden for inputing data i MySQL, så når jeg vil legge til en rad, jeg bare legge tabellen navn som den første strengen og resten er alt kolonne navn og deretter sine data uten å måtte sitte der og manuelt gjøre det om og om igjen. Lykke til!

Svarte 17/06/2009 kl. 17:04
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more