Ruby Blocks有简写吗?

时间:2016-08-08 20:57:47

标签: ruby verbosity

我发现自己对Ruby中的以下冗长的写作感到恼火:

polys.each { |poly| poly.edges.each {|edge| draw edge.start, edge.end } }

polys是一个多边形数组,edge是Polygon返回边数组的方法)

理想情况下,我想将此缩短为:

polys.each.edges.each { draw _.start, _.end }

更具体地说,我想知道:

  • 我们怎么能像第一个一样写一个method_missing hack? (在使用缺少方法调用时,枚举器可以对枚举返回的每个项调用此方法)
  • 有没有办法摆脱|x|使用任何符号或默认名称?

1 个答案:

答案 0 :(得分:4)

没有。你最近能做的就是:

polys.flat_map(&:edges).each { |_| draw _.start, _.end }

flat_map将转换另一个数组中的数组并将其展平为单维数组。如果块内部正在调用没有参数的单个方法,则可以使用&:edges快捷方式。

话虽如此,我可能会更接近您的初始提案,因为它更具可读性:

polys.each do |poly| 
  poly.edges.each {|edge| draw edge.start, edge.end }
end

请记住,你曾经编写过一段代码,但它已经阅读了很多,所以可读性胜过简洁。