2012-10-09 47 views
2

當我嘗試使用rps_game_winner方法(見下文)CodeAcademy實驗室,它正常工作與以下輸入:Ruby的字符串對比

> 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" 

當我將其提交autograder功課,它總是失敗,並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(聯合)和1.9(檢查)方面表現不同。

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 
+0

感謝Jing Ji的迴應。 – Gokul

+0

@Gokul你能告訴它是否適合你嗎?如果是的話,你能接受答案嗎?謝謝 –