【问题标题】:Code folding on consecutive collect/select/reject/each连续收集/选择/拒绝/每个的代码折叠
【发布时间】:2010-12-17 22:47:11
【问题描述】:

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

【问题讨论】:

    标签: ruby textmate folding


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

    【讨论】:

    • 我发布的代码只是我写下来的东西,没有真正研究它,我只是想给它我写的大部分代码的大致外观(/me 转为选择 -> 收集)。我将研究注入以及它是否有助于我简化事情。
    猜你喜欢
    • 1970-01-01
    • 2016-05-12
    • 1970-01-01
    • 2016-10-26
    • 2017-03-10
    • 1970-01-01
    • 2018-11-22
    • 2018-02-19
    • 1970-01-01
    相关资源
    最近更新 更多