【发布时间】:2012-03-30 08:28:12
【问题描述】:
t = [
[
[["Armando", "P"],["Dave", "S"]],
[["Richard", "R"],["Michael", "S"]],
],
[
[["Allen", "S"],["Omer", "P"]],
[["David E.", "R"], ["Richard X.", "P"]]
]
]
def rps_game_winner(game)
raise WrongNumberOfPlayersError unless game.length == 2
if (game[0][1] =~ /[r]/i && game[1][1] =~ /[s]/i) || (game[0][1] =~ /[s]/i && game[1][1] =~ /[p]/i) || (game[0][1] =~ /[p]/i && game[1][1] =~ /[r]/i)
return game[0]
elsif (game[0][1] =~ /[r]/i && game[1][1] =~ /[p]/i) || (game[0][1] =~ /[s]/i && game[1][1] =~ /[r]/i) || (game[0][1] =~ /[p]/i && game[1][1] =~ /[s]/i)
return game[1]
elsif game[0][1] == game[1][1]
return game[0]
else
raise NoSuchStrategyError.new
end
end
def rps_tournament_winner(t)
t.each do |pair|
yield pair
end
end
rps_tournament_winner(t) { |x| rps_game_winner(x) }
所以我得到的错误是:NoSuchStrategyError: NoSuchStrategyError - 这意味着产量正在将一个值传递给块,并且正在传递给我的方法 rps_game_winner 并且它正在评估某些东西并给出该错误 - 每个方法。
但它没有正确评估它....因为它应该查看 Armando and Dave 并返回一个获胜者,然后它应该返回并继续查看下一对并返回获胜者,等等。
附:当我做puts pair 时,我看到了正确的值——我已经在一对上测试了rps_game_winner 方法,它工作正常。它只是在多对上进行迭代,这给我带来了来回传递控制权的问题。
【问题讨论】:
-
我认为你想提高
WrongNumberOfPlayers.new,而不是WrongNumberOfPlayers(班级)。 -
@Linux_iOS.rb.cpp.c.lisp.m.sh:不,他没有。虽然两者都有效,并且实际上两者在语义上相同,但您的版本不是惯用的 Ruby。
-
@JörgWMittag:虽然它们是相同的,但我绝不会在任何代码中使用
raise WrongNumberOfPlayers。虽然它有效,但我只是在查看一些代码,我会假设正在引发类对象。