有两种常见的风格选择
do end
和
{}
用于Ruby中的块:
第一种非常常见的风格是由Ruby on Rails推广的,基于单行与多行的简单规则:
- 对于单行块使用大括号
{}
- 对于多行块使用
do end
这是有道理的,因为在一行代码中使用do/end不易读懂,但对于多行块,让一个闭合的
}
单独出现在一行上,与在ruby中使用
end
的所有其他内容(如模块、类和方法定义(
def
等)以及控制结构(
if
,
while
,
case
等))不一致。
第二种较少见的风格被称为语义化或"
Weirich Braces",由已故杰出的rubyist Jim Weirich提出:
- 对于过程性块使用
do end
- 对于函数式块使用大括号
{}
这意味着当块被评估为其返回值时,它应该是可链接的,而
{}
大括号对于方法链接更有意义。
另一方面,当块被评估为其副作用时,返回值并不重要,块只是在"做"某些事情,因此不能链接。
这种语法上的区别传达了关于代码块评估的视觉意义,以及你是否应该关心它的返回值。
例如,在这里,代码块的返回值被应用于每个项目:
items.map { |i| i.upcase }
然而,在这里它并没有使用块的返回值。它是按照过程操作,并且对其进行了副作用:
items.each do |item|
puts item
end
另一个语义化样式的好处是,您不需要更改大括号来执行/结束,只因为添加了一行到块中。
观察发现,偶然地,函数块通常是单行的,而过程块(例如配置)是多行的。因此,遵循Weirich样式最终看起来几乎与Rails样式相同。
each
works with brackets but not withdo
-end
(ruby)、Block definition - difference between braces anddo
-end
?、Ruby multiline block withoutdo
end
、What is the difference or value of these block coding styles in Ruby? 和 Ruby block and unparenthesized arguments 的副本。 - Jörg W Mittag