109 Stimmen

Was sind die Ruby Gotchas, vor denen ein Neuling gewarnt werden sollte?

Ich habe vor kurzem die Programmiersprache Ruby gelernt, und im Großen und Ganzen ist es eine gute Sprache. Aber ich war ziemlich überrascht, als ich feststellte, dass sie nicht so einfach ist, wie ich erwartet hatte. Genauer gesagt, schien mir die "Regel der geringsten Überraschung" nicht sehr beachtet zu werden (das ist natürlich sehr subjektiv). Zum Beispiel:

x = true and false
puts x  # displays true!

und die Berühmten:

puts "zero is true!" if 0  # zero is true!

Vor welchen anderen "Gotchas" würden Sie einen Ruby-Neuling warnen?

0 Stimmen

@phrases.insert(0, p) OK @phrases.insert(p) NICHTS passiert @phrases<<p # OK

0 Stimmen

Warum ist true and false true zurückgeben?

3 Stimmen

Denn "x = wahr und falsch" wird eigentlich als "(x = wahr) und falsch" interpretiert. Das ist eine Frage des Vorrangs der Operatoren: "und" hat eine niedrigere Priorität als "=". Die meisten anderen Sprachen haben die umgekehrte Priorität, ich weiß nicht, warum sie diese Reihenfolge in Rails gewählt haben, ich finde es sehr verwirrend. Wenn Sie das "normale" Verhalten wollen, geben Sie einfach "x = (true und false)" ein, dann wird x falsch sein.

20voto

Dan Vinton Punkte 25571
  • Affe Parcheando . Ruby hat offene Klassen, so dass ihr Verhalten zur Laufzeit dynamisch geändert werden kann...

  • Objekte können auf undefinierte Methoden reagieren wenn method_missing o send außer Kraft gesetzt wurde. Dies nutzt den nachrichtenbasierten Methodenaufruf von Ruby aus. Schiene ' ActiveRecord System nutzt dies mit großem Erfolg.

17voto

Daniel Lucraft Punkte 6926

Bei einem Anruf super ohne Argumente, wird die überschriebene Methode mit denselben Argumenten wie die überschreibende Methode aufgerufen.

class A
  def hello(name="Dan")
    puts "hello #{name}"
  end
end

class B < A
  def hello(name)
    super
  end
end

B.new.hello("Bob") #=> "hello Bob"

Zum tatsächlichen Aufruf super ohne Argumente, müssen Sie sagen super() .

3 Stimmen

Wenn B#hello hat name = 42 vor der super und dann heißt es "Hallo 42".

13voto

John Topley Punkte 110122

0 Stimmen

Wow, das ist ein Gotcha, von dem ich nichts wusste. Danke!

0 Stimmen

Im Falle von geschützten Methoden ist dies auf ziemlich komplizierte Weise der Fall.

11voto

MiniQuark Punkte 43252

Ich hatte große Schwierigkeiten, Klassenvariablen, Klassenattribute und Klassenmethoden zu verstehen. Dieser Code könnte einem Neuling helfen:

class A
  @@classvar = "A1"
  @classattr = "A2"
  def self.showvars
    puts "@@classvar => "+@@classvar
    puts "@classattr => "+@classattr
  end
end

A.showvars
  # displays:
  # @@classvar => A1
  # @classattr => A2

class B < A
  @@classvar = "B1"
  @classattr = "B2"
end

B.showvars
  # displays:
  # @@classvar => B1
  # @classattr => B2

A.showvars
  # displays:
  # @@classvar => B1   #Class variables are shared in a class hierarchy!
  # @classattr => A2   #Class attributes are not

1 Stimmen

Ja, Klassenvariablen können kompliziert sein. Ich denke, die meisten erfahrenen Ruby-Anwender würden sagen, dass es klug ist, sie zu vermeiden, da es normalerweise andere Wege gibt, ein Problem ohne sie zu lösen. Einige Sprachenthusiasten würden sogar sagen, dass die Klassenvariablen in Ruby auf Sprachebene schlecht konzipiert sind.

8voto

karina Punkte 795

Eine sache, die ich gelernt habe, war, den Operator ||= sorgfältig zu verwenden. und besonders vorsichtig zu sein, wenn man mit booleschen Werten arbeitet. ich habe normalerweise a ||= b als Auffanglösung verwendet, um 'a' einen Standardwert zu geben, wenn alles andere fehlgeschlagen ist und 'a' gleich null bleibt. aber wenn a falsch und b wahr ist, dann wird a wahr zugewiesen.

0 Stimmen

Sie können verwenden a = b if a.nil? o @a = b unless defined?(@a) .

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