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.

4voto

singpolyma Punkte 10745
x = (true and false) # x is false

0 und '' sind wahr, wie Sie betont haben.

Sie können eine Methode und ein Modul/eine Klasse mit demselben Namen haben (was sinnvoll ist, da die Methode tatsächlich zu Object hinzugefügt wird und somit ihren eigenen Namensraum hat).

Es gibt keine Mehrfachvererbung, aber häufig werden "Mixin-Module" verwendet, um gemeinsame Methoden zu mehreren Klassen hinzuzufügen.

0 Stimmen

0==true // argh der c compiler in meinem gehirn explodiert!!

1 Stimmen

0==true ergibt in Ruby false. Dass 0 wahr ist, macht Sinn, weil wahr in Ruby ein Objekt ist. In C hat 0 zufällig die gleiche Darstellung wie false.

0 Stimmen

In einer Bedingung in Ruby, nur false et nil sind die falschen. Alle anderen sind wahre Werte.

3voto

danmayer Punkte 4218

Ich denke, es ist immer gut, .length auf Dinge zu verwenden... da Größe von fast alles unterstützt wird und Ruby dynamische Typen hat, können Sie wirklich seltsame Ergebnisse erhalten, die .size aufrufen, wenn Sie den falschen Typ haben... Ich würde viel lieber einen NoMethodError: undefined method `length' bekommen, also rufe ich in der Regel nie size für Objekte in Ruby auf.

hat mich mehr als einmal gebissen.

Denken Sie auch daran, dass Objekte IDs haben, daher versuche ich, keine Variablen namens id oder object_id zu verwenden, um Verwirrung zu vermeiden. Wenn ich eine ID für ein Users-Objekt benötige, ist es am besten, es mit user_id zu bezeichnen.

Nur meine Meinung dazu

2voto

monkut Punkte 39059

Ich bin neu in Ruby, und auf meiner ersten Runde traf ich ein Problem in Bezug auf die Änderung von Floats/Strings zu einer ganzen Zahl. Ich begann mit den Floats und kodierte alles als f.to_int . Als ich dann aber weitermachte und dieselbe Methode für Strings verwendete, wurde ich beim Ausführen des Programms überrumpelt.

Offensichtlich hat ein String keine bis_int Methode, aber Floats und Ints schon.

irb(main):003:0* str_val = '5.0'
=> "5.0"
irb(main):006:0> str_val.to_int
NoMethodError: undefined method `to_int' for "5.0":String
        from (irb):6
irb(main):005:0* str_val.to_i
=> 5

irb(main):007:0> float_val = 5.0
=> 5.0
irb(main):008:0> float_val.to_int
=> 5
irb(main):009:0> float_val.to_i
=> 5
irb(main):010:0>

Die willkürlichen Klammern haben mich zuerst auch verwirrt. Ich sah einige Codes mit und einige ohne. Es dauerte eine Weile, bis ich merkte, dass beide Stile akzeptiert werden.

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