In tutti i linguaggi di programmazione che supportano i parametri opzionali che ho visto c'è un'imitazione che i parametri opzionali devono apparire alla fine della dichiarazione. Nessun parametro richiesto può essere incluso dopo un articolo opzionale. Qual è il motivo? Suppongo che possa essere richiesto dal compilatore/interprete.Perché i parametri facoltativi devono apparire alla fine della dichiarazione
risposta
Bene, se fossero in prima linea, come rileveresti quando hanno smesso di essere rifornito? L'unico modo sarebbe se il tipo di variabile fosse diverso dopo i parametri opzionali. Un po 'un requisito strano, quindi ha senso che tu li imponga solo per essere l'ultimo (salva il problema delle complesse regole per il rilevamento del parametro opzionale "finale").
Inoltre, è il modo più naturale per farlo quando si chiama la funzione.
Solo supposizioni in natura: Forse ha qualcosa a che fare con le convenzioni di chiamata (ad esempio i parametri vengono premuti nello stack da sinistra a destra, i parametri opzionali vengono semplicemente omessi nel caso in cui non siano stati specificati).
Ne dubito, penso che il chiamante invierà semplicemente i valori predefiniti. – tstenner
Java e C# non hanno chiamato i parametri in modo da non si può fare:
myfunction(param1='Meh', optionalParam=2)
quello che dovete fare:
myfunction('Meh', 2)
Altrimenti
myFunction(2, 'Meh')
è ambigua. Come si suppone che il compilatore sappia che intendevi inserire 2 nel set di parametri opzionale?
C# 4.0 ha parametri con nome. – Incognito
I parametri facoltativi alla fine consentono di interrompere la specifica dei parametri ad un certo punto, ad es.
void Test(int a, optional int b = 0, optional int c = 0) { ... }
Test(3);
Se si effettua c
un parametro obbligatorio, dovreste usare sintassi simile a questo:
Test(3, , 2);
Test(a := 3, c := 2);
Il vantaggio di un parametro opzionale è che può essere trattato come se wasn' t c'è. Se i parametri facoltativi si trovano nel mezzo dell'elenco dei parametri, ciò non è possibile senza "contare le virgole" o utilizzando una sintassi troppo dettagliata.
Funziona perfettamente in Ruby. I parametri obbligatori all'inizio della lista dei parametri sono vincolati da sinistra a destra dall'inizio della lista degli argomenti. I parametri obbligatori alla fine dell'elenco dei parametri sono vincolati da destra a sinistra dalla fine dell'elenco degli argomenti. I parametri facoltativi sono associati da sinistra a destra dall'inizio dell'elenco di argomenti rimanente. Tutti gli argomenti rimasti sono destinati a riposare argomenti. Non fornire un argomento obbligatorio o fornire più di 'num_mandatory + num_optional' argomenti quando non ci sono parametri di riposo è un errore. –
consideri una dichiarazione del tipo:
int foo(float a, int b=0, int c=0, float d);
(noto come ho definito i parametri defult nel mezzo della lista), che viene successivamente chiamato come
foo(0.0,1,2.0)
Qual è la chiamata? In particolare è stato omesso b
o c
?
compilatore designer possono aggirare questo ostacolo utilizzando parametri denominati
foo(a=0,c=0,d=2.0)
una funzionalità disponibile in pitone per esempio.
Questa funzione è disponibile anche in C#: foo (a: 0, c: 0, d: 2.0). Il problema è cosa fare quando vengono fatte chiamate di posizione. – configurator
Funziona bene in Ruby. I parametri obbligatori all'inizio della lista dei parametri sono vincolati da sinistra a destra dall'inizio della lista degli argomenti. I parametri obbligatori alla fine dell'elenco dei parametri sono vincolati da destra a sinistra dalla fine dell'elenco degli argomenti. I parametri facoltativi sono associati da sinistra a destra dall'inizio dell'elenco di argomenti rimanente. Tutti gli argomenti rimasti sono destinati a riposare argomenti. Non fornire un argomento obbligatorio o fornire più di 'num_mandatory + num_optional' argomenti quando non ci sono parametri di riposo è un errore. –
Nel tuo specifico esempio, 'a' sarebbe legato a' 0.0', 'd' a' 2.0', 'b' a' 1' e 'c' otterrebbe il suo valore predefinito di' 0'. –
Questa è solo una regola arbitraria creata dai progettisti di quelle lingue specifiche.Non c'è assolutamente alcuna ragione tecnica per cui questa restrizione dovrebbe esserci.
funziona bene in rubino:
def foo(m1, m2, o1='o1', o2='o2', *rest, m3, m4)
return m1, m2, o1, o2, rest, m3, m4
end
foo(1, 2, 3, 4)
# => [1, 2, 'o1', 'o2', [], 3, 4]
foo(1, 2, 3, 4, 5)
# => [1, 2, 3, 'o2', [], 4, 5]
foo(1, 2, 3, 4, 5, 6)
# => [1, 2, 3, 4, [], 5, 6]
foo(1, 2, 3, 4, 5, 6, 7)
# => [1, 2, 3, 4, [5], 6, 7]
foo(1, 2, 3, 4, 5, 6, 7, 8)
# => [1, 2, 3, 4, [5, 6], 7, 8]
Tutti argomenti obbligatori devono essere forniti:
foo(1, 2, 3)
# => ArgumentError: wrong number of arguments (3 for 4)
Senza il parametro resto, fornendo più di argomenti number_of_optional number_of_mandatory + è un errore:
def bar(m1, m2, o1='o1', o2='o2', m3, m4)
return m1, m2, o1, o2, m3, m4
end
bar(1, 2, 3, 4, 5, 6, 7)
# => ArgumentError: wrong number of arguments (7 for 6)
Parametri obbligatori all'inizio del parametro l'elenco di ter è vincolato da sinistra a destra dall'inizio della lista degli argomenti. I parametri obbligatori alla fine dell'elenco dei parametri sono vincolati da destra a sinistra dalla fine dell'elenco degli argomenti. I parametri facoltativi sono associati da sinistra a destra dall'inizio dell'elenco di argomenti rimanente. Tutti gli argomenti rimasti sono destinati a riposare argomenti.
Ovviamente corretto --- tanto più che hai un esempio funzionante da mostrare. Ma io cavillerò nella misura in cui i linguaggi c-like sono per lo più costituiti da semplici regole, e il modo rubino è prolisso: sarebbe una grande sorpresa in c, e almeno una piccola in C++. – dmckee
@dmckee: L'unico linguaggio C-like che conosca argomenti facoltativi sarebbe C#, ma le sue regole sono enormemente complicate a causa di complesse interazioni tra argomenti opzionali e sovraccarico basato sull'arità. Trovo entrambi * almeno * allo stesso modo complicato, forse C# anche un po 'di più. –
- 1. previsto ';' alla fine della dichiarazione/vector/C++
- 2. I commenti possono apparire prima della dichiarazione DOCTYPE?
- 3. Percorsi con i parametri facoltativi a Suave
- 4. parametri facoltativi sammyjs
- 5. Activator.CreateInstance con parametri facoltativi
- 6. Parametri facoltativi Linq
- 7. Parametri facoltativi con Specflow
- 8. Parametri facoltativi per le interfacce
- 9. Perché i parametri di restituzione devono essere denominati?
- 10. perché mettere un "const" alla fine?
- 11. La dichiarazione della funzione non deve apparire all'interno dell'istruzione condizionale?
- 12. Parametri nominati/facoltativi in Delphi?
- 13. Perché il ritorno alla fine della funzione è meno efficiente?
- 14. Entity Framework con parametri facoltativi?
- 15. I parametri del modello devono essere tipi?
- 16. Selenio: Scorrere fino alla fine della pagina
- 17. Perché chiamare GC.KeepAlive alla fine e non all'inizio?
- 18. ASP.NET MVC 2 - do UrlParameter.Le voci opzionali devono trovarsi alla fine del percorso?
- 19. Css allineato alla fine della pagina
- 20. Cosa significa "1" alla fine di una dichiarazione php print_r?
- 21. Vim commento continuazione alla fine della riga
- 22. Valori predefiniti per i parametri facoltativi nell'argomento opzioni
- 23. spring-data-mongo - parametri di query facoltativi?
- 24. Parametri facoltativi con query denominata in Sospensione?
- 25. Come creare API REST con parametri facoltativi?
- 26. Perché i parametri facoltativi hanno superato valori errati in Visual Studio 2015?
- 27. Laravel 4: Come passare più parametri facoltativi
- 28. Cosa significa() alla fine della subroutine Perl?
- 29. Sottostringa vai alla fine della stringa
- 30. jQuery scorrere alla fine della pagina
Sì sembra così ovvio ora :). Grazie. – Incognito
@Incognito: funziona perfettamente in Ruby. Se ci sono parametri obbligatori dopo quelli opzionali, gli argomenti obbligatori vengono presi dalla fine dell'elenco degli argomenti. Tutto ciò che rimane sono gli argomenti opzionali. Vedi http://StackOverflow.Com/questions/2896106/why-optional-parameters-must-appear-at-the-end-of-the-declaration/2900474/#2900474 per un esempio. –