1

我发现自己对以下用 Ruby 编写的冗长代码感到恼火:

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

polys是多边形数组,边是多边形返回边数组的方法)

理想情况下,我想将其缩短为以下内容:

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

更具体地说,我想知道:

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

1 回答 1

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

请记住,您编写了一次代码,但它被阅读了很多,因此可读性胜过简洁性。

于 2016-08-08T21:26:33.487 回答