Ruby HAML不尊重布尔值?

时间:2017-03-08 15:07:46

标签: ruby haml

我在HAML中有一个循环如下:

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

目标是在第一年后添加delta列多年。

调试行我可以看到first正确设置为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

1 个答案:

答案 0 :(得分:3)

像许多语言一样,Ruby在布尔逻辑中有一种称为短路的东西。表达式如'和'只有当两个表达式都为真时才为真,所以如果第一个表达式为假,则永远不会调用第二个表达式。

在您的情况下,(first = false)解析为false,因此and表达式返回false而不运行next

这是表达式的重要功能:

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} Δ %