Forum: Italian Ruby user group Significato doppio pipe

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
64aa4b69fdd7127e6f3ee16ae065a620?d=identicon&s=25 Giampiero Zanchi (giampiz)
on 2009-02-11 17:30
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
72e0b3f5418bfcf47488918109068c4c?d=identicon&s=25 Andrea Cuius (q_rails)
on 2009-02-11 17:42
(Received via mailing list)
|| è 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 :]
6111b4012d1401ca83fdcea6b1d71237?d=identicon&s=25 Antonio Cangiano (Guest)
on 2009-02-11 17:59
(Received via mailing list)
On Wed, Feb 11, 2009 at 11:30 AM, Giampiero Zanchi <cidza@tin.it> 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.
64aa4b69fdd7127e6f3ee16ae065a620?d=identicon&s=25 Giampiero Zanchi (giampiz)
on 2009-02-12 09:15
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
8768bcdbda1adf80e4da6744268868af?d=identicon&s=25 Pietro Giorgianni (giorgian)
on 2009-02-12 09:25
(Received via mailing list)
2009/2/12 Giampiero Zanchi <cidza@tin.it>:
> 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
64aa4b69fdd7127e6f3ee16ae065a620?d=identicon&s=25 Giampiero Zanchi (giampiz)
on 2009-02-12 10:13
grazie mille Pietro e a buon rendere (spero presto)
ciao
Giampiero
64aa4b69fdd7127e6f3ee16ae065a620?d=identicon&s=25 Giampiero Zanchi (giampiz)
on 2009-02-12 12:32
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...
Dc64befa87f79e074d55f83bcf9daa49?d=identicon&s=25 Silvano Stralla (sistrall)
on 2009-02-12 14:18
(Received via mailing list)
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 Zanchi <cidza@tin.it>:
> (ha[1] ||= []) << "anything"
> Ml@lists.ruby-it.org
> 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 Stralla . . .
email: silvano.stralla@sistrall.it
site: http://www.sistrall.it
64aa4b69fdd7127e6f3ee16ae065a620?d=identicon&s=25 Giampiero Zanchi (giampiz)
on 2009-02-12 17: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.
Dc64befa87f79e074d55f83bcf9daa49?d=identicon&s=25 Silvano Stralla (sistrall)
on 2009-02-12 18:25
(Received via mailing list)
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 Zanchi <cidza@tin.it> wrote:
> Posted via http://www.ruby-forum.com/.
> _______________________________________________
> Ml mailing list
> Ml@lists.ruby-it.org
> 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 Stralla . . .
email: silvano.stralla@sistrall.it
site: http://www.sistrall.it
This topic is locked and can not be replied to.