代码之家  ›  专栏  ›  技术社区  ›  Rajagopalan

方法级联在这里是可能的吗?

  •  1
  • Rajagopalan  · 技术社区  · 7 年前

    我这里有三行代码,如下所示

    local = headers.zip(*data_rows).transpose
    local = local[1..-1].map {|dataRow| local[0].zip(dataRow).to_h}
    p local
    

    现在,如果你看上面三行,我必须把第一行的结果存储在变量local中,因为它会在第二行的两个地方使用,正如我所示,所以我不能用第一行级联第二行吗?我试过这样用水龙头

    local = headers.zip(*data_rows).transpose.tap{|h|h[1..-1].map {|dataRow| h[0].zip(dataRow).to_h}}
    

    tap正在返回文档中解释的self,所以当我使用tab时不能得到最终结果吗?不管怎样,在一行中实现这个结果的其他方法,这样我就不必使用局部变量了?

    2 回复  |  直到 7 年前
        1
  •  4
  •   mikej heading_to_tahiti    7 年前

    如果您使用的是Ruby 2.5.0或更高版本,那么可以使用 yield_self 为了这个。

    local = headers.zip(*data_rows).transpose.yield_self { |h| h[1..-1].map { |dataRow| h[0].zip(dataRow).to_h } }
    

    yield_self tap 因为他们都屈服了 self 去街区。区别在于这两个方法各自返回什么。

    Object#tap 然后回归自我 . Kernel#yield_self 返回块的结果

    Here's an answer 在前面的一个问题中,我给出了两个进一步的例子,说明这些方法中的每种方法在哪里是有用的。

        2
  •  2
  •   Cary Swoveland    7 年前

    使用数据执行工作代码通常很有帮助,以便更好地理解要计算的内容。看到 transpose zip ,通常是可互换的,一起使用,这是一个简化可能的线索( a = [1,2,3]; b = [4,5,6]; a.zip(b) => [[1, 4], [2, 5], [3, 6]] <= [a,b].transpose

    以下是我的数据:

    headers=[1,2,3]
    data_rows=[[11,12,13],[21,22,23],[31,32,33],[41,42,43]]
    

    下面是工作代码返回的结果:

    local = headers.zip(*data_rows).transpose
    local[1..-1].map {|dataRow| local[0].zip(dataRow).to_h}
      #=> [{1=>11, 2=>12, 3=>13}, {1=>21, 2=>22, 3=>23},
      #    {1=>31, 2=>32, 3=>33}, {1=>41, 2=>42, 3=>43}]
    

    data_rows.map { |row| headers.zip(row).to_h }
      #=> [{1=>11, 2=>12, 3=>13}, {1=>21, 2=>22, 3=>23},
      #    {1=>31, 2=>32, 3=>33}, {1=>41, 2=>42, 3=>43}]
    
    推荐文章