Ruby 如何递归调用块并返回值

Ruby 如何递归调用块并返回值,ruby,recursion,Ruby,Recursion,骑士移动是骑士在其他位置的一系列实例 如果我同时打印出knight.position和target,有时它们相等,但该方法不会返回任何结果 我认为这与块如何处理返回有关,但我还没有弄清楚 我的代码如下所示: def dfs_rec knight, target if knight if knight.position == target return knight end moves = knight.moves.size - 1 moves

骑士移动是骑士在其他位置的一系列实例

如果我同时打印出knight.position和target,有时它们相等,但该方法不会返回任何结果

我认为这与块如何处理返回有关,但我还没有弄清楚

我的代码如下所示:

def dfs_rec knight, target  
  if knight
    if knight.position == target
      return knight
    end

    moves = knight.moves.size - 1
    moves.times do |num|
      dfs_rec knight.moves[num], target
    end
  end
end

为什么不重构成更像这样的东西呢

class Knight
  def at_position?(target_position)
    position == target_position
  end

  def can_move_to?(target_position)
    moves.include?(target_position)
  end
end

# to find a knight in an array of knights that can move to `position`
knights.select { |knight| knight.can_move_to?(position) || knight.at_position?(position) } #=> [ <Knight>, <Knight> ]

您没有从块显式调用return,因此行为应该是相同的。它似乎对我有效,我尝试以dfs\u recOpenStruct.newposition:1调用,它返回了OpenStruct实例。@kris如果第一个对象匹配,它就可以工作,但不是之后。我现在看到迭代器将递归调用视为任何其他方法。我需要在全球范围内把骑士们召集到某个阵型中去做我想做的事。是的,我可能会这样做。谢谢@robert Great-如果这回答了您的问题,请继续接受,并在左侧打勾,以便其他用户知道您已经准备好了。