Significato doppio pipe


#1

ciao a tutti
c’è qualcuno che gentilmente sa spegarmi il significato del doppio
carattere pipe (||)? Credo non ci sia bisogno di sottolineare come sia
difficile se non impossibile fare una ricerca in tal senso.
Esempi d’uso sono graditi.
Grazie


#2

|| è uguale a ‘or’, in breve è un operatore binario

pippo || pippa

è come scrivere

pippo or pippa

foo = life.somethinginteresting || pippa

se il primo è nullo assegna il secondo, ovvero pippa :]


#3

On Wed, Feb 11, 2009 at 11:30 AM, Giampiero Z. removed_email_address@domain.invalid wrote:

ciao a tutti
c’è qualcuno che gentilmente sa spegarmi il significato del doppio
carattere pipe (||)? Credo non ci sia bisogno di sottolineare come sia
difficile se non impossibile fare una ricerca in tal senso.

Si tratta della forma più comune per esprimere l’OR logico in Ruby:

true || true # true
true || false # true
false || true # true
false || false # false

In gergo tecnico è uno short-circuit operator, perché valuta la seconda
espressione soltanto se necessario.

Ad esempio: (3 > 1) || ( 3 > 10) ritorna true, senza mai calcolare la
seconda espressione (3>10), perché la prima espressione è true, e questo è
sufficiente (per l’or) per rendere tutta l’espressione vera.

Potresti persino scrivere true || 3/0 e non otterresti un errore,
perché la
divisione per zero non verrebbe mai eseguita.

L’operatore può anche essere usato per valori che non sono booleani, in tal
caso la prima espressione viene restituita a meno che sia false o nil:

3 || 10 # 3
false || 100 # 200
nil || 200 # 200

Ad esempio la seguente riga assegna di default 1000 alla variable
my_input,
soltanto se ARGV[0] esiste (di preciso, se non è nil o false). Se un
argomento è stato passato allo script, allora ARGV[0] che sarebbe una
stringa, viene convertito a intero:

my_input = (ARGV[0] || 1000).to_i

Un altro operatore simile è && che si occupa di fare l’AND delle due
espressioni. In questo caso, la seconda espressione è calcolata solamente
se la prima non è nil or false, infatti se la prima espressione è false o
nil, allora tutta l’espressione con l’AND non potrà essere true. In tal
caso, la prima espressione viene restituita, altrimenti la seconda.

Ad esempio:

3 && 10 # 10
false && 100 # false
false && 3/0 # false
nil && 200 # nil

Ciao,
Antonio

http://antoniocangiano.com - Zen and the Art of Programming
http://math-blog.com - Mathematics is wonderful!
http://stacktrace.it - Aperiodico di resistenza informatica
Follow me on Twitter: http://twitter.com/acangiano
Currently writing “Ruby on Rails for Microsoft Developers” for Wrox.


#4

ciao Antonio e grazie per la risposta; ci sono alcune cose che non
conoscevo, quindi mi sei stato molto utile. Approfitto della tua
(vostra) disponibilità e rilancio con un’altra domanda:
in passato ho visto uno script, ma non saprei ritrovarlo, in cui || era
usato in modo diverso; mi pare di ricordare che servisse a assegnare un
valore a un oggetto (forse a un elemento di hash o di array)
condizionandolo al fatto di essere vuoto, o qualcosa del genere. Sai
dirmi niente in proposito?
grazie
Giampiero


#5

grazie mille Pietro e a buon rendere (spero presto)
ciao
Giampiero


#6

2009/2/12 Giampiero Z. removed_email_address@domain.invalid:

ciao Antonio e grazie per la risposta; ci sono alcune cose che non
conoscevo, quindi mi sei stato molto utile. Approfitto della tua
(vostra) disponibilità e rilancio con un’altra domanda:
in passato ho visto uno script, ma non saprei ritrovarlo, in cui || era
usato in modo diverso; mi pare di ricordare che servisse a assegnare un
valore a un oggetto (forse a un elemento di hash o di array)
condizionandolo al fatto di essere vuoto, o qualcosa del genere. Sai
dirmi niente in proposito?

a ||= b

equivale a:

a = b unless a

oppure:

if !a
a = b
end


#7

mi rispondo con un esempio tratto e riadattato dal forum in inglese:
ha = {} ;
(ha[1] ||= []) << “anything”
(ha[1] ||= []) << “anithing else”
p ha
produce
{1=>[“anything”, “anithing else”]}

ha = {} ;
ha[1] = “qualcosa” #ho aggiunto questa riga
(ha[1] ||= []) << “anything”
(ha[1] ||= []) << “anithing else”
p ha
produce
{1=>“qualcosaanythinganithing else”}

ancora devo capire esattamente cosa succede…


#8

Ciao!

Provo a risponderti. Nel secondo esempio, la riga

ha[1] = “qualcosa”

inizializza ha[1] con una stringa. Di conseguenza nelle righe successive

(ha[1] ||= [])

non produce effetti e il contenuto di ha[1] rimane invariato (resta la
stringa inizializzata alla riga precedente).

Quindi

<< “anything”

viene eseguito nei confronti di una stringa: ecco il motivo per cui a
“qualcosa” vengono accodate le altre stringhe.

Spero di non averti confuso con questo mio primo post in lista!

Ciao,
Silvano

2009/2/12 Giampiero Z. removed_email_address@domain.invalid:

(ha[1] ||= []) << “anything”
removed_email_address@domain.invalid
http://lists.ruby-it.org/mailman/listinfo/ml


Considera l’ambiente prima di stampare questa email. Dai, che
l’equazione è semplice: meno A4, più alberi.

. . . Silvano S. . . .
email: removed_email_address@domain.invalid
site: http://www.sistrall.it


#9

In effetti ho dimenticato di dirlo: in Ruby, quando si tratta di
valutare espressioni booleane, vale la regola che “tutto è true tranne
quello che è nil o false”.

Ciao,
s/v

On Thu, Feb 12, 2009 at 5:10 PM, Giampiero Z. removed_email_address@domain.invalid wrote:

Posted via http://www.ruby-forum.com/.


Ml mailing list
removed_email_address@domain.invalid
http://lists.ruby-it.org/mailman/listinfo/ml


Considera l’ambiente prima di stampare questa email. Dai, che
l’equazione è semplice: meno A4, più alberi.

. . . Silvano S. . . .
email: removed_email_address@domain.invalid
site: http://www.sistrall.it


#10

ciao Silvano e grazie
sì alla fine c’ero arrivato anch’io;
sono ancora agli inizi e devo ancora allenare la mente alle raffinatezze
di Ruby.
Il passaggio logico che mi mancava era che, dal punto di vista di un
booleano nil e false vengono valutati allo stesso modo. Questo spiega
perché possiamo usare un operatore booleano (sì lo so dovrei dire
metodo) per verificare l’esistenza di un oggetto.