我在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.3
和HAML 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} Δ %