458 Stimmen

Was bedeutet ||= (oder-gleich) in Ruby?

Was bedeutet der folgende Code in Ruby?

||=

Gibt es eine Bedeutung oder einen Grund für die Syntax?

0voto

fulvio Punkte 25332
irb(main):001:0> a = 1
=> 1
irb(main):002:0> a ||= 2
=> 1

Denn a war bereits eingestellt auf 1

irb(main):003:0> a = nil
=> nil
irb(main):004:0> a ||= 2
=> 2

Denn a war nil

-1voto

meh Punkte 1913

Diese Ruby-Lang-Syntax. Die richtige Antwort ist, in der Ruby-Lang-Dokumentation nachzusehen. Alle anderen Erklärungen vernebeln .

Google

"ruby-lang docs Abgekürzte Zuweisung".

Ruby-Lang-Dokumente

https://docs.ruby-lang.org/en/2.4.0/syntax/assignment_rdoc.html#label-Abbreviated+Aufgabe

-3voto

Ymox Punkte 157

a ||= b ist dasselbe wie die Aussage a = b if a.nil? ou a = b unless a

Aber zeigen alle 3 Optionen die gleiche Leistung? Mit Ruby 2.5.1 ist dies

1000000.times do
  a ||= 1
  a ||= 1
  a ||= 1
  a ||= 1
  a ||= 1
  a ||= 1
  a ||= 1
  a ||= 1
  a ||= 1
  a ||= 1
end

dauert auf meinem PC 0,099 Sekunden, während

1000000.times do
  a = 1 unless a
  a = 1 unless a
  a = 1 unless a
  a = 1 unless a
  a = 1 unless a
  a = 1 unless a
  a = 1 unless a
  a = 1 unless a
  a = 1 unless a
  a = 1 unless a
end

dauert 0,062 Sekunden. Das ist fast 40 % schneller.

und dann haben wir auch noch:

1000000.times do
  a = 1 if a.nil?
  a = 1 if a.nil?
  a = 1 if a.nil?
  a = 1 if a.nil?
  a = 1 if a.nil?
  a = 1 if a.nil?
  a = 1 if a.nil?
  a = 1 if a.nil?
  a = 1 if a.nil?
  a = 1 if a.nil?
end

was 0,166 Sekunden dauert.

Dies hat zwar im Allgemeinen keine nennenswerten Auswirkungen auf die Leistung, aber wenn Sie das letzte Quäntchen an Optimierung benötigen, sollten Sie dieses Ergebnis in Betracht ziehen. Nebenbei bemerkt: a = 1 unless a ist für den Neuling leichter zu lesen, er ist selbsterklärend.

Anmerkung 1: Der Grund für die mehrfache Wiederholung der Zuweisungszeile ist, dass der Overhead der Schleife auf die gemessene Zeit reduziert werden soll.

Anmerkung 2: Die Ergebnisse sind ähnlich, wenn ich a=nil vor jeder Zuweisung auf Null gesetzt.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X