C'è qualche saggezza dietro & # 8220; e & # 8221 ;, & # 8220; o & # 8221; operatori in Ruby?

StackOverflow https://stackoverflow.com/questions/1434842

Domanda

Mi chiedo perché ruby ??dia a e , o una precedenza inferiore a & amp; & amp; , || , e assegnare operatore? C'è qualche motivo?

È stato utile?

Soluzione

La mia ipotesi è che sia un riporto diretto da parte di Perl. Gli operatori o e e sono stati aggiunti successivamente in Perl 5 per situazioni specifiche in cui si desiderava una precedenza inferiore.

Ad esempio, in Perl, qui desideriamo che || abbia una precedenza inferiore, in modo da poter scrivere:

try to perform big long hairy complicated action     || die ;

ed essere sicuri che il || non avrebbe inghiottito parte dell'azione. Perl 5 ha introdotto o , una nuova versione di || che ha una precedenza bassa, proprio per questo scopo.

Un esempio in Ruby in cui è possibile utilizzare o ma non || :

value = possibly_false or raise "foo"

Se si utilizza || , si tratterebbe di un errore di sintassi.

Altri suggerimenti

La differenza è la precedenza. || , & amp; & amp; hanno una precedenza superiore a = , ma e , o hanno più basso. Quindi, mentre puoi fare:

a = nil || 0

Dovresti fare:

a = (nil or 0)

per ottenere lo stesso effetto. Se lo fai:

a = nil or 0

Il risultato dell'espressione sarebbe ancora 0, ma un valore sarebbe zero.

Hanno una priorità molto bassa in modo che gli operandi non debbano essere racchiusi tra parentesi, come talvolta accade con & amp; & amp; e || .

Essere in grado di controllare la precedenza dei propri operatori a volte è utile, specialmente se si è preoccupati della leggibilità - le parentesi extra nelle istruzioni condizionali a volte possono oscurare la logica effettiva.

Ad essere sincero, però, penso che la ragione per cui Ruby ha i livelli di precedenza degli operatori booleani deriva principalmente dal fatto che Matz era un programmatore Perl prima di aver mai scritto Ruby, e da ciò ha preso in prestito gran parte della sintassi e degli operatori lingua.

Credo che l'idea sia specificamente quella di portarli al di sotto degli operatori di assegnazione, in modo da poter scrivere test logici con assegnazioni ma senza parentesi.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top