Perché non ci sono operatori di assegnazione composti per operatori logici (come ||, && etc)?

19

Secondo ECMA-262, parte 11.13, di seguito è riportato l'elenco completo degli operatori di assegnazione composta: *= /= %= += -= <<= >>= >>>= &= ^= |= .

Secondo la parte 11.11, var c = a || b metterà il valore a in c se ToBoolean(a) è vero e metterà il valore b in c altrimenti. In quanto tale, il OR logico viene spesso utilizzato come operatore di coalescenza, ad es.

function (options) {
    options = options || {};
}

In modo abbastanza frequente, la coalescenza viene utilizzata per specificare il valore predefinito per la variabile, come mostrato sopra: a = a || b .

Sembra che l'operatore di assegnazione composta ||= sarebbe davvero utile, consentendo di scrivere il codice sopra in modo più breve e più pulito: a ||= b . Tuttavia, non è lì (sebbene *= , += e altri operatori di assegnazione composti siano).

La domanda è, perché?

    
posta penartur 05.03.2013 - 10:18
fonte

3 risposte

10

Una possibile ragione è che gli operatori logici && e || hanno un comportamento di "cortocircuito". L'operando di destra di && e || non viene valutato se non necessario. Forse per questo motivo i progettisti di linguaggi hanno deciso che il significato di un'espressione come a ||= f() non era ovvio, e quindi tali operatori erano meglio tralasciati.

    
risposta data 06.03.2013 - 17:33
fonte
8

La risposta generale a tutte le domande su "perché questa funzionalità linguistica non è stata implementata" è che il team che ha progettato la lingua ha deciso che il vantaggio non superava il costo.

Il costo può assumere molte forme. Ci vuole tempo e impegno per implementare una funzionalità linguistica, ma c'è anche il costo intrinseco della complessità: la caratteristica rende la lingua più complessa o ambigua, sproporzionata rispetto al suo potenziale vantaggio?

L'ipotetico operatore ||= fa qualcosa di fondamentalmente diverso dagli altri operatori di assegnazione composti. Mentre gli altri operatori sono di natura puramente matematica, questo è diverso: sostituisce un valore per un altro (nel contesto che hai descritto).

Data questa ambiguità (l'operatore esegue due diverse funzioni, a seconda del contesto), non è difficile capire perché non è stato incluso nella lingua. Sebbene tu affermi che cambiando

function (options) {
    options = options || {};
}

a

function (options) {
    options ||= {};
}

eseguire la coalescenza nulla è una caratteristica preziosa, il beneficio è molto meno chiaro per me. Se si verifica la sostituzione del valore, sembra logico (e più chiaro) avere entrambi i valori sul lato destro del segno di uguale, per fornire un'indicazione visiva che tale sostituzione possa verificarsi.

C # ha preso un percorso diverso e utilizza un operatore specifico per la coalizione nulla.

    
risposta data 06.03.2013 - 17:14
fonte
3

Hai ragione che ||= è un costrutto utile. Esiste in Perl.

Infatti Perl rende tutti questi disponibili:

**=    +=    *=    &=    <<=    &&=   -=    /=    
|=     >>=   ||=   .=    %=     ^=    //=   x=

Alcuni di questi sono grandi ( .= aggiunge qualcosa alla fine di una stringa), altri meno ( &&= ??? Suppongo che la variabile venga impostata sul lato destro se sia la variabile sia la variabile sono vero, ma perché mai dovresti farlo?)

Ciò che è incluso in una lingua è davvero una caratteristica della sua filosofia di design.

    
risposta data 07.03.2013 - 15:11
fonte

Leggi altre domande sui tag