2010-05-27 9 views
39

Mi piace la proposta di Scala della precedenza degli operatori, ma in alcuni rari casi, le regole non modificate possono essere sconvenienti, poiché si hanno delle restrizioni nella denominazione dei metodi. Ci sono modi per definire un'altra regola per una classe/file, ecc. In Scala? In caso contrario, sarebbe risolto in futuro?Precedenza dell'operatore in Scala

+3

Threading relativo alla mailing list: http://scala-programming-language.1934581.n4.nabble.com/More-unicode-alternatives-for-ASCII-operators-td2008146.html – retronym

risposta

91

La precedenza degli operatori è fissata nel Scala Reference - 6.12.3 Infix Operations dal primo carattere nell'operatore. Elencati in ordine crescente di precedenza:

(all letters) 
| 
^ 
& 
= ! 
< > 
: 
+ - 
*/% 
(all other special characters) 

E non è molto probabile che cambierà. Probabilmente creerà più problemi di quanti ne risolva. Se si utilizza la normale precedenza dell'operatore, cambiarlo per una classe sarà abbastanza confuso.

+5

@huynhjl dal riferimento citato: " C'è una eccezione a questa regola, che riguarda gli operatori di assegnazione (§6.12.4). La precedenza di un operatore di assegnazione è la stessa di quella di assegnazione semplice (=). Cioè, è inferiore alla precedenza di qualsiasi altro operatore ". §6.12.4 descrive un operatore di assegnazione come un finale in "=". Quindi la lista sopra è incompleta, piuttosto che errata. –

+6

@Luigi Plinge, '===' non è un operatore di assegnazione perché in un'eccezione: un operatore che termina con '=' è un operatore di assegnazione * a meno che l'operatore non inizi con un carattere uguale *. Guardando il thread gmane e l'altro link, lo stesso Martin ha indicato che SLS aveva bisogno di un aggiornamento. Non riesco ancora a vedere un aggiornamento. – huynhjl

+1

Penso che la decisione di rendere '(tutte le lettere)' quella "più debole" sia strana: 'a contiene b || c contiene d', che secondo me è un costrutto frequente, ha bisogno di parentesi ... –

7

Non esiste tale capacità e c'è poca probabilità che venga aggiunta nel prossimo futuro.

0

regole non modificati possono essere scomodo, perché avete restrizioni nel nominare i metodi

  • non si dispone di alcuna restrizione nel nominare i vostri metodi. Ad esempio, puoi definire i metodi +, -, * e così via per una classe.
  • dobbiamo anche seguire de facto "regole non modificate" (applicate dalle regole di precedenza degli operatori Scala) menzionate nella risposta precedente (https://stackoverflow.com/a/2922456) di Thomas Jung - è comune per molti se non tutti i linguaggi di programmazione e l'algebra astratta; non è necessario ridefinire la precedenza degli operatori per a + b * c.

Vedere il capitolo 6 del manuale http://www.scala-lang.org/docu/files/ScalaByExample.pdf per l'esempio di classe "Rational".

+0

di "restrizioni nel nominare i tuoi metodi" Voglio dire che se, ad esempio, pensi che '+' sia un nome perfetto per il tuo metodo, ci possono essere situazioni che dovresti essere costretti a scegliere un altro nome a causa della precedenza non modificabile. – Jeriho

+1

Non tutti i linguaggi di programmazione hanno la precedenza degli operatori non modificabile. Guarda i comandi infisso/infixr/infixl di haskell. – Jeriho

1

C'è stato uno feature request generato nello typelevel fork of the scala compiler, una versione del compilatore che "mostra in anteprima" le caratteristiche sperimentali. Gli sviluppatori hanno suggerito che se qualcuno dovesse scrivere un SIP per questo, potrebbe essere preso in considerazione per l'implementazione.

Ma nel suo stato attuale, non c'è modo di ignorare la precedenza. Le sue regole sono formalmente definite nello language specification.