如何在 Ruby 中使用 &block

How to use &block in Ruby

我正在尝试使用 Ruby 中的块,我有以下代码:

  def positions
    return horizontally_position if orientation == "horizontally"
    vertically_position
  end

  def horizontally_position
    res = []
    for x in position[0]..end_coord(0) 
      res << [x, position[1]]
    end
    return res
  end

  def vertically_position
    res = []
    for y in position[1]..end_coord(1)
      res << [position[0], y]
    end
    return res
  end

好像有重复的代码,想用block或者yield来提高性能,但是不知道怎么办!

这样做:

  def positions
    return h_v_position(0, {[x, position[1]]}) if orientation == "horizontally"
    h_v_position(1, {[position[0], y]})
  end

  def h_v_positions(coord, &block) 
    res = []
    for x in position[coord]..end_coord(coord) 
      res << block.call
    end
    return res
  end

但是不行..有什么帮助吗?

如果您需要处理块参数,您可以使用隐式 yield:

def foo
  yield
end

或者您可以显式传递块并使用 block.call:

调用它
def foo(&block)
  block.call
end

因此,如果您将 res << &block 替换为 res << block.call,则应正确调用块。

在 google 中思考和搜索后,我找到了最好的方法,并了解了如何在 Ruby 中使用 &blocksyields

在 bigining 中,我的问题是这个重复的代码:

  def horizontally_position
    res = []
    for x in position[0]..end_coord(0) 
      res << [x, position[1]]
    end
    return res
  end

  def vertically_position
    res = []
    for y in position[1]..end_coord(1)
      res << [position[0], y]
    end
    return res
  end

The first thing I do to aboid the repeated code was use a yield:

  def position_by(coord) # ²
    res = []
    for n in position[coord]..end_coord(coord) 
      res <<  yield(n) # ³
    end
    return res
  end  

  def horizontally_position # ¹
    position_by(0) { |n| [n, position[1]] } # ⁴
  end

  def vertically_position # ¹
    position_by(1) { |n| [position[0], n] } # ⁴
  end

¹ 当调用此方法时,它将调用 position_by(1)position_by(0).
² 这个方法会开始执行,当执行到<< yield(n)...
³ 它将再次出现 vertically_position" 或 horizontally_position,并将 position_by 中的 yield 替换为 horizontally_position 中括号中的代码(或 vertically_position). 很抱歉冗余。

完成后我看到了方法 position_by(coord) 并希望对其进行一些重构。

First refactor, using yield:

  def position_by(end_coor)
    position[end_coor]..end_coord(end_coor).map do |x|    
        yield x
    end
  end

Then use a &block:

  def position_by(coord, &block) # ⁵
        (position[coord]..end_coord(coord)).map &block
  end 

⁵ 这里我们将每个位置映射到一个 & block ,一个块可以是 [ x , position ( 1) ] 或 [position ( 0 ) , y] ,其中 x 或 and 将被替换对应位置[坐标]。