关于语义学上的Ruby块结构(附代码)

66 阅读1分钟

我在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来说是多余的。

考虑到这一点,视觉上的差异似乎并不巨大,所以我想从现在开始,我将在我的代码库中坚持这一规则。