当我尝试在CodeAcademy Labs中使用rps_game_winner
方法(见下文)时,它可以正常使用以下输入:
> rps_game_winner([ ["Dave", "P"], ["Armando", "S"] ])
valid value: p
valid value: s
=> ["Armando", "S"]
> rps_game_winner([ ["Allen", "P"], ["Richard", "P"] ])[0]
valid value: p
valid value: p
=> "Allen"
当我将其提交给自动编程家庭作业时,它始终以NoSuchStrategyError
。
Failure/Error: rps_game_winner([ ["Dave", "P"], ["Armando", "S"] ])[0].should eq("Armando"), "Incorrect Winner returned"
NoSuchStrategyError:
NoSuchStrategyError
有人可以帮忙吗?感谢。
def rps_game_winner(game)
raise WrongNumberOfPlayersError unless game.length == 2
a1=[(game[0][1]).downcase]
a2=[(game[1][1]).downcase]
a3=a1.to_s
a4=a2.to_s
valid=["r","p","s"]
if(valid.include?(a3))
puts "valid value: "+a3
else
raise NoSuchStrategyError
end
if(valid.include?(a4))
puts "valid value: "+a4
else
raise NoSuchStrategyError
end
if(win(a1, a2))
return game[0]
else
if a1.eql?(a2)
return game[0]
else
return game[1]
end
end
return game[0] if a1.eql?(a2)
end
答案 0 :(得分:2)
首先,我没有你的家庭作业的背景。但是根据NoSuchStrategyError,它当然会引用 valid.include?(x)。
原因可能是(我假设)不同版本的Ruby(1.8 codeacademy Labs vs 1.9 autograder)。因为Array#to_s在1.8(join)和1.9(inspect)上的行为不同。
a1=[(game[0][1]).downcase]
a2=[(game[1][1]).downcase]
a3=a1.to_s
a4=a2.to_s
valid=["r","p","s"]
在1.8中:a3将类似于“s”。
在1.9:a3将类似于“[\”s \“]”。
请检查此链接: Ruby 1.9 Array.to_s behaves differently?
解决这个问题:
a1=game[0][1].downcase
a2=game[1][1].downcase
删除a3和a4,只比较a1和a2在1.8和1.9上都应该没问题。
除此之外,您还可以通过执行(与您的问题无关)删除一些冗余:
[a1, a2].each do |x|
if valid.include?(x)
puts "valid value: #{x}"
else
raise NoSuchStrategyError
end
end