我在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的块)
答案 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来使用注入调用来使用浮点值。