我在Github通知中巡视了一下,发现了Jim Weirich创建的一个有趣的开放问题:"{ }的语义规则VS do/end的语义规则",在Ruby风格指南仓库 。
这条语义规则说,在块的主要目的是返回一个值的地方使用
{ },在块的主要目的是执行副作用的地方使用do/end。
这个规则的主要问题是,它意味着存在一些必须在单行上使用do/end 的情况。那么,这有什么问题呢?嗯,大多数人会认为这不是很好看,很啰嗦,而且感觉有点黑,例如:...。
# one-liner that abides to the semantic rule
(1..10).each do |i| some_instance.side_effect = i end
与之相对的是:
# idiomatic Ruby one-liner
(1..10).each { |i| some_instance.side_effect = i }
我想说的是,差别并不大,而且通过遵守语义规则,可以使代码更具有可读性。此外,这不仅仅是关于代码的美学,也是关于它的内在语义。
这可以分为两个方向:好的,即提高代码的可读性;坏的,即可能让不知道如何解释的开发者感到困惑。
这也可以应用于lambda符号:
-> { ... }
->(obj) { ... }
与
-> do ... end
->(obj) do ... end
Lambdas还有一个语义包,可以这么说。我通常用它们来做一些计算,并将结果返回到其他地方使用,而不会对其他一切产生副作用,procs则更适合。
可以说,{ } VSdo/end 的区别对lambdas来说是多余的。
考虑到这一点,视觉上的差异似乎并不巨大,所以我想从现在开始,我将在我的代码库中坚持这一规则。