2015-05-29 19 views
6

Kann jemand diesen Ausdruck beleuchten. Scheint so, als wären beide gleich, aber sie sind es nicht.Unterschied zwischen a || a = b und a = a || b in Rubin?

a || a = b or a ||= b 

und

a = a || b 

wenn

a = 4 und b = 6, Ausgang ist immer 4

Diese immer verwirren und mich misconcept. Kann mir bitte jemand das erklären?

+1

Might [diesen Artikel] lesen möchten (http://www.rubyinside.com/what-rubys-double-pipe-or-equals-really-does-5488.html). 'a || a = b ', 'a = a || b 'und' a || = b 'sind alle leicht unterschiedlich. – Oka

Antwort

10

sucht nach a wenn a truthy ist, kehrt a, sonst a = b erfolgt heißt Sie b ‚s-Wert a zuweisen.

a = a || b 

Dies ist eine Zuweisungsoperation. Hier weisen Sie a einen Wert zu, unabhängig davon, welchen Wert es enthält. So ist a gleich a || b. Im zweiten Teil der Aussage suchen Sie nach a. Wenn sein Wert truthy ist, weisen Sie ihn a selbst zu, andernfalls weisen Sie den Wert ba zu.

TL; DR

a = a || b zuweist Wert (je nach Zustand) zua unabhängig von welchem ​​Wert es hält.

a ||= b Rückkehr a wenn bereits vorhanden, tut sonst a = b

mit Beispiel erklären:

Sie von a || a = b als a || (a = b) denken kann. Nehmen wir nun a = 4 und b = 6 an.

Da nach der Rangfolge, ist dies eine Operation OR ist und seit Reihenfolge der Operationen für OR wird von links nach rechts wir mit ersten a starten:

# lets call this Fig. 1 
     a || (a = b) 
    ^
     | 
     . 
    (here) 

Diese a hat 4 Wert, der ein truthy Wert ist . Daher stoppt die Auswertung dann und dort und 4 wird zurückgegeben. (Warum Hinweis:true || anything = true)

Jetzt können a = nil und b = 6 nehmen. Wir beginnen wieder am selben Ort (Abb. 1). Da anil ist, was in Ruby falsch ist, bewegen wir uns auf die rechte Seite der ODER-Operation, d.h.a = b

# lets call this Fig. 2 
     a || (a = b) 
      ^
       | 
       . 
      (here) 

Da dies eine Zuweisungsoperation, wird es noch ausgeführt werden, und wir werden am Ende 6-a zuweisen.

Zurück zu a = a || b. Sie können dies als a = (a || b) denken. Offensichtlich ist es eine Rangordnungsoperation. Da die Reihenfolge der Operationen für die Zuweisung von rechts nach links ist, wird zuerst ausgewertet.

# lets call this Fig. 3 
     a = (a || b) 
      ^
      | 
      . 
      (here) 

Wenn a = 4 und b = 6, a || b kehrt 4(wie oben erörtert). Sonst, wenn a = nil und b = 6, a || b wird 6 zurückgeben.

Nun wird der Wert, der von dieser || Operation zurückgegeben wird, der ersten a zugewiesen.

# lets call this Fig. 4 
     a = (a || b) 
    ^
     | 
     . 
    (here) 
+0

Vielen Dank für Ihre Antwort, können Sie mit einem Beispiel erklären, das uns helfen könnte, es besser zu verstehen. –

+0

@ChitrankSamaiya Ich habe versucht, meine Antwort mit Beispielen in meinem neuesten Schnitt zu erklären. Bitte prüfe. – shivam

+0

Ausgezeichnete Antworten +1 –

4

Ein gemeinsames Mißverständnis ist, dass:

a ||= b zu a = a || b gleichwertig ist, aber es verhält sich wie a || a = b

In a = a || b, eine durch die Aussage, um etwas auf jedem Lauf gesetzt wird, während Mit a || a = b wird a nur gesetzt, wenn a logisch falsch ist (dh wenn es nicht oder falsch ist), weil || ist "Kurzschluss".

Lassen Sie mich halten, dass einfach:

Das heißt, wenn die linke Seite der || Vergleich ist wahr, es gibt keine Notwendigkeit, die rechte Seite zu überprüfen.

mehr Referenz RubyInside

Verwandte Themen