C'è qualche saggezza dietro & # 8220; e & # 8221 ;, & # 8220; o & # 8221; operatori in Ruby?
-
07-07-2019 - |
Domanda
Mi chiedo perché ruby ??dia a e
, o
una precedenza inferiore a & amp; & amp;
, ||
, e assegnare operatore? C'è qualche motivo?
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.