20

In Ruby, una convenzione standard è quello di utilizzare un punto interrogativo alla fine di un nome di metodo per indicare il metodo restituisce un risultato booleano:L'utilizzo di caratteri speciali nei nomi di funzione

[].empty? #=> true 

Un'altra convenzione standard è quello di terminare un nome di metodo con un punto esclamativo se il metodo è distruttivo (cioè, modifica i dati originali):

mylist.sort! # sort mylist in-place 

Recentemente ho visto queste stesse convenzioni utilizzate nello Schema. Il che mi fa meravigliare, quali altre lingue usano/supportano questa convenzione? Ci sono altri caratteri speciali comunemente usati per nominare con queste o altre lingue?

risposta

15

La risposta è, ovviamente, la lingua (e la cultura linguistica) specifica.

Ad esempio, a seconda della lingua, tutti i seguenti sono appropriati: vuoto-p, vuoto ?, vuoto, is_empty o isEmpty. (Questi esempi, ovviamente, non sono inclusi).

Gli esempi nella domanda originale provengono da Ruby dove tale uso di? e ! per terminare i nomi dei metodi sono, se del caso, accettati. Questa accettazione viene da 1) prontamente accessibile come terminatori di simboli nella grammatica 2) uso di? e ! nella libreria standard. Tuttavia, dovrebbe essere notato che! non è usato universalmente per implicare "effetto collaterale" ed è generalmente presente solo su forme alternative: salva/salva !, ordina/ordina !, ecc. Ci sono un numero enorme di metodi che eseguono effetti collaterali che non hanno il ! prefisso.

Personalmente, se stavo progettando una lingua, consentirei?,!e 'essere validi caratteri finali non quotati nei nomi dei simboli. Anche se alcune lingue consentono l'escape completo di simboli, come Scala, tali simboli vengono solitamente evitati perché è un dolore doverli citare per l'uso.

 
// in Scala, esp. with Java-compat, the last form is generally used although 
// the first two are perfectly valid -- do what makes sense in the language 
foo.`empty?` 
foo.empty_? 
foo.isEmpty 

Quando a Roma ...

  • Scala - `` vuoto o empty_?? (non comune)
  • C/C++/JS/Java/Python/Perl - no? o ! negli identificatori; JS/Java consentono $; $ è un sigillo in Perl
  • C/C++/Perl/JS - mani in alto?
  • C# - IsEmpty (metodo o proprietà) o vuoto (proprietà)
  • Python - is_empty o isEmpty per Guido-guida (anche se di solito __len__ protocollo: if not len(foo): "empty!")
  • Java - isEmpty per Language Guide
  • Rubino - trailing speciale? e ! (citando?)
  • JS - accesso identificativo indiretto: obj ["vuoto?"] (non comune per questo)
  • "Lisp" (convenzionale): vuoto-p per predicato; variazioni nel lettore/quotazione

Felice di vedere correzioni e/o aggiunte - è solo una goccia in un secchio.

+0

Aiuto aiuto! Come posso trasformare la parte inferiore di questo post in una "wiki della comunità"? –

+0

Chiunque può modificare il tuo post, quindi è un wiki della comunità. Cosa stai cercando di fare? Posso incorporare questi e tutti i commenti di altri nella domanda di livello superiore originale, in modo che ci sia un unico elenco per tutti. –

+0

Preferibilmente solo per avere l'elenco in fondo modificato. Non ero sicuro che potesse essere modificato da altri. Questa cosa stackoverflow è ancora un po 'nuova per me. –

-1

Se si considera Javascript come lingua, molte strutture sembrano utilizzare il carattere "$" per indicare "Selettore"; Ad esempio, è possibile utilizzare $("id-of-some-item") in Prototype.js o $("#id-of-some-item") in jQuery per selezionare un tag che è stato scritto <div id="id-of-some-item">. L'uso di queste funzioni di selezione è in realtà abbastanza complicato e potente (se sei interessato, controlla la documentazione di supporto su prototypejs.org e jquery.com), ma si riducono a fare qualcosa che considero semanticamente simile a quello che hai indicato.

Anche in questo caso, si presume che si contenga Javascript come lingua.

+12

* Se *? È un po 'duro, no? – paxdiablo

+1

Oh, lascia che tiri fuori il nastro ... è persino Turing Complete. (Test Geek.) Sì, è un linguaggio di programmazione per computer, forse non apprezzato da alcuni, ma Lemon Meringue Pie non smette improvvisamente di diventare pasticcio perché detesto il suo sapore. –

+0

Non conterei su questo ($ == Selector): http://stackoverflow.com/questions/205853/why-would-a-javascript-variable-start-with-a-dollar-sign –

1

La preimpostazione di "@" per un nome di metodo (o qualsiasi identificatore) in C# consente di denominare tale metodo con una parola chiave normalmente riservata.

void null() {} 
// Invalid token 'null' in class, struct, or interface member declaration 

void @null() 
// compiles 

Non farlo; è principalmente per il codice generato dalla macchina, come i set di dati. MSDN page on the topic.

+0

C'è un modo per citare un identificatore arbitrario in C#? –

3

Non sono un grande fan dei caratteri speciali nei nomi di funzioni, ma poi batterò anche a morte, con un gambo di sedano bagnato per stuzzicare il dolore, chiunque trovo spazi nei nomi dei file: -)

il ? variante può altrettanto facilmente essere fatto con qualcosa di simile isEmpty() e la variante ! con sortInPlace().

L'inglese è un linguaggio molto adattivo, anche senza la punteggiatura.

In entrambi i casi, i miei linguaggi di scelta (C e Java) utilizzano la punteggiatura per tutti i tipi di altre cose. Avere anche loro degli identificatori renderebbe l'analisi lessicale un incubo.

+3

"Anche averli negli identificatori renderebbe l'analisi lessicale un incubo." Questa affermazione non è semplicemente vera. Mentre non difenderò la sintassi di Ruby (che non è esente da contesto e ha molte stranezze strane: ad esempio a??b:c), l'uso di non [a-z _] [a-z0-9_] non è necessariamente più complicato da eseguire attraverso un lexer. Considerare Scheme come un contro-esempio molto "semplice" (e Perl as, forse un primo esempio, sebbene NON consenta caratteri "speciali" negli identificatori). L'uso di tali simboli, tuttavia, è ampiamente aperto alle opinioni. –

+0

@ user166390 Ruby ha una grammatica più uniforme. Penso che non sia sensibile al contesto e possa essere descritto in BNF. C++ richiede il contesto per analizzare e non può essere descritto in BNF. Aggiungere caratteri speciali agli identificatori complicherebbe l'analisi, ma sono d'accordo sul fatto che in teoria l'analisi sarebbe ancora possibile, forse anche rapidamente, ma penso che il codice per farlo sarebbe difficile nella pratica. – Sqeaky