使用触发器的实际原因是什么?

时间:2015-06-04 15:53:22

标签: ruby

我正在学习Ruby并理解块的概念,但是procs让我很困惑。

你能说明一些可以从使用过程中受益的实际用例,初学者可以很容易理解吗?

2 个答案:

答案 0 :(得分:0)

规范示例是命令模式,例如映射字符串到procs:

该命令到达并通过地图分派到其关联的proc。

答案 1 :(得分:0)

我建立了一个国际象棋游戏,作为我自己的Ruby学习过程的一部分。我在“野外”非面向对象练习中使用过程的一个例子是定义线性移动而不是预定义数量空间的棋子的移动。

Piece类包含多个部分使用的所有内容:

Class Piece

  @available_moves = []

  def linear_movement (x = 1, moves = [], &direction) # <= proc in parameters
    move = yield (x) # <= call to proc
    if on_board?(move) && (capture?(move) || empty?(move)) && (moves[-1] == nil || !capture?(moves[-1]))
      moves << move
      linear_movement( x + 1, moves, &direction) # <= recursive call *
    else
      moves
    end
  end

  def move_ul
    Proc.new { |x| "#{ left(x).chr }#{ forward(x) }" }
  end

  def move_dl
    Proc.new { |x| "#{ left(x).chr }#{ backward(x) }" }
  end

  def move_ur
    Proc.new { |x| "#{ right(x).chr }#{ forward(x) }" }
  end

  def move_dr
    Proc.new { |x| "#{ right(x).chr }#{ backward(x) }" }
  end

end

Bishop类具有主教特定逻辑:

Class Bishop < Piece

  def populate_available_moves
    @available_moves = []
    directions = [move_ul, move_dl, move_ur, move_dr]
    directions.each {|x| @available_moves.concat(linear_movement(&x))} # <= practical application
  end

end

其他具有线性运动的部件具有类似的方法。这里的方法调用没有完全说明,但重要的是在野外使用Procs的一个例子。

根据你的“初学者”水平,字符串插值应该非常简单,并且类继承可能也包含在人们查看Procs的时间。递归可能是你可能还没有涵盖的唯一一件事(对一个方法本身的调用),所以在你有机会研究它之前,也许不要过于认真。除了递归之外,我认为初学者应该可以达到它。