2017-03-08 13 views
0

次のように私はHAMLのループを持っている:Ruby HAMLはブール値を尊重していませんか?

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

目標は初年度、次の年のためdelta列を追加することです。 は正しくfalseに設定されていますが、nextに続く列はまだ出力されていることがわかります。私はブール値のない比較を行う場合

、物事が期待どおりに動作:

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

誰がフードの下で何が起こっているかを理解していますか? Ruby 2.2.3HAML 4.0.7

答えて

3

ルビーを使用して

は、多くの言語のように、ブール論理で短絡と呼ばれるものがあります。 'と'のような式は、両方の式が真である場合にのみ真です。したがって、最初の式がfalseの場合、2番目の式は呼び出されません。

(first = false)はfalseに解決されるため、andという式は、nextを実行することなくfalseを返します。

これは、のような表現のための重要な機能である:短絡なし

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

、myobject.some_methodは毎回のMyObjectにはゼロだったエラーをスローします。

あなたのHAMLを書き込むことによって、このように問題を回避することができます

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

フン、私の部分の総脳おなら、おかげで、英子。私は 'finishing_moves'の宝石からユーティリティーを使って、短い1ライナーを考え出すことができました:'(first = false).false?そして次は最初に。 –

関連する問題