2017-03-08 3 views
0

Ich habe eine Schleife in HAML wie folgt:Ruby HAML respektiert booleans nicht?

- first = true 
- @years.each do |year| 
    %th #{year} 
    - first = false and next if first == true 
    %th #{year} Δ 
    %th #{year} Δ % 

Das Ziel ist delta Spalten für Jahre nach dem ersten Jahr hinzuzufügen.

Beim Debuggen der Zeile kann ich sehen, dass first korrekt auf false gesetzt ist, aber die Spalten nach next werden immer noch ausgegeben.

Wenn ich den Vergleich ohne booleans durchführen, die Dinge funktionieren wie erwartet:

- first = :true 
- @years.each do |year| 
    %th #{year} 
    - first = :false and next if first == :true 
    %th #{year} Δ 
    %th #{year} Δ % 

Versteht jemand, was unter der Haube vor sich geht?

Mit Ruby 2.2.3 und HAML 4.0.7

Antwort

3

Rubin, wie viele Sprachen, hat etwas Kurzschluss in der Booleschen Logik bezeichnet. Ausdrücke wie 'und' sind nur wahr, wenn beide Ausdrücke wahr sind. Wenn also der erste Ausdruck falsch ist, wird der zweite nie aufgerufen.

In Ihrem Fall wird (first = false) zu false aufgelöst, so dass der Ausdruck and false zurückgibt, ohne dass jemals next ausgeführt wird.

Dies ist ein wichtiges Merkmal für Ausdrücke wie:

do.something if !myobject.nil? and myobject.some_method 

Ohne Kurzschlüssen, würde myobject.some_method einen Fehler aus, jedes Mal myobject null war.

können Sie das Problem vermeiden, indem Sie Ihre haml auf diese Weise zu schreiben:

- first = true 
- @years.each do |year| 
    %th #{year} 
    - if first == true 
    - first = false 
    - next 
    %th #{year} Δ 
    %th #{year} Δ % 
+0

Bah, total Gehirn Furz auf meinem Teil, danke, eiko. Ich konnte mir einen kurzen One-Liner einfallen lassen, der Hilfsmittel aus dem 'finishing_moves'-Juwel verwendete:' (first = false) .false? und nächstes wenn zuerst.wörtlich? ' –