连续收集/选择/拒绝/每个代码折叠

时间:2009-11-18 16:18:43

标签: ruby textmate folding

我在ruby中玩数组和哈希很多,最后得到一些代码如下:

sum = two_dimensional_array.select{|i|
  i.collect{|j|
    j.to_i
  }.sum > 5
}.collect{|i|
  i.collect{|j|
    j ** 2
  }.average
}.sum

(让我们假装上面的代码示例现在有意义了......)

问题在于,即使TextMate(我选择的编辑器)很容易选择简单的{...}do...end块,它也无法弄清楚(这是可以理解的,因为即使我不能找到一个“正确”的折叠方式,上面的块开始和结束折叠它们。

您如何折叠上面的代码示例?

PS:考虑到它可以有2级折叠,我只关心外部连续的(与i的块)

1 个答案:

答案 0 :(得分:1)

说实话,令人费解的事情可能会让TextMate和其他任何需要维护它的人混淆,并且将来包括你。

每当你看到汇总成单个值的东西时,使用Enumerable#inject是一个很好的例子。

sum = two_dimensional_array.inject(0) do |sum, row|
  # Convert row to Fixnum equivalent
  row_i = row.collect { |i| i.to_i }

  if (row_i.sum > 5)
    sum += row_i.collect { |i| i ** 2 }.average
  end

  sum # Carry through to next inject call
end

你的例子中有什么奇怪的是你使用select来返回完整的数组,据说使用to_i进行转换,但实际上Enumerable #select不会这样做,而是拒绝任何函数返回nil的函数。我认为这不是你的价值观。

此外,根据您的.average方法的实现方式,您可能希望使用0.0而不是0来使用注入调用来使用浮点值。