1

我在 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 的块)

4

1 回答 1

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 为注入调用播种以使用浮点值。

于 2009-11-18T16:34:48.023 回答