我正在研究我的第二個ruby程序,並且在字面上堅持站在我和完成的程序之間的最後一件事。我的任務是寫一個岩石,紙,剪刀法,返回勝出的球員。要做到這一點,需要[[「Dave」,「S」],[「Dan」,「R」]]形式的遊戲參數,其中「S」和「R」是「剪刀」和「搖滾」分別。然後確定贏家並返回包含獲勝策略的數組。如果遊戲長度錯誤或策略爲==或不在範圍內,也會引發錯誤。Ruby正則表達式與正則表達式匹配
class WrongNumberOfPlayersError < StandardError ; end
class NoSuchStrategyError < StandardError ; end
def rps_game_winner(game)
raise WrongNumberOfPlayersError unless game.length == 2
#Hash of whose Keys are the strategies and values are the players
playr = {(game[0].slice(1).downcase) => game[0],
(game[1].slice(1).downcase) => game[1]} #This fits on the above line in IRB
#Collect Strategies in array for comparison
stgys = playr.keys
#raise NoSuchStrategyError unless players give strategies in range, no duplicates
raise NoSuchStrategyError unless (stgys.select { |s| s.match /[prs]/ }.size == 2)
#determine Winner
case stgys.to_s
when /p/ && /r/
playr["p"]
when /p/ && /s/
playr["s"]
when /s/ && /r/
playr["r"]
end
end
這可以像我期望的那樣工作,檢查策略對正則表達式並返回勝者。除最後一種情況外,遇到時總是返回零。如果我把播放器[「R」]下要麼成功,其他whens的,它在「/ P/& &/R /」返回正確的球員。如果我改變順序,它仍然不起作用,所以我知道它不需要處理它的位置。如果我在case語句之外單獨進行匹配調用,則正則表達式/ r /會評估它的應用。所以我相信我已經縮小了與/ s /和/ r /相關的問題,否則我就難倒了。還有任何幫助DRYness讚賞,謝謝你的幫助!
似乎是來自saas課程的作業:) – 2012-03-20 20:32:18
你知道嗎,遲到開始希望能夠趕上,但是在對這個代碼打了幾個小時的代碼之後,我意識到阿曼多可能並不是在開玩笑說它是一個老年人級別課程:) – 2012-03-21 01:32:00