2009-11-18 35 views
1

我与阵列玩和哈希相当多的红宝石和一些代码,看起来像这样结束:守则折叠连续收集/选择/拒绝/每

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级折叠的,我只在乎外表个连续的(与我的块)

回答

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转换,但实际上可枚举#选择确实没有这样的事,而是拒绝任何针对该函数返回nil 。我假设这不是你的价值观。

同样取决于您的.average方法的实现方式,您可能希望使用0.0而不是0来注入调用,以使用浮点值。

+0

我发布的代码只是我没有真正看过它而写下来的东西,我只是想给它看大部分我写的代码的大概外观(/我转了select - > collect)。 我会研究注入和它是否可以帮助我简化事情。 – Kostas 2009-11-19 14:42:36