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

ruby和许多语言一样,在布尔逻辑中具有所谓的短路。诸如"one_answers"的表达式仅在两个表达式都是正确的情况下才是正确的,因此,如果第一个表达式为false,则从未称为false。

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

这是表达式的重要功能:

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

没有短路,MyObject.some_method每次MyObject均为nil时都会出现错误。

您可以通过以这种方式编写HAML来避免问题:

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

最新更新