2012-03-06 3 views
1

Ruby를 처음 접한다고해서 서두를 수 있습니다. Ruby 및 if 문

나는 이런 식으로 뭔가를 시도했다 : 의도 한대로 작동하지 않는 그러나

raise NoSuchStrategyError unless ((player1[1].downcase && player2[1].downcase) == ("p" || "r" || "s")) 

. 첫 번째 인수가 "p"인 경우에만 인식됩니다. 그것이 "r"또는 "s"이면 오류를 던졌습니다. 이 속기를 할 수있는 더 좋은 방법은

raise NoSuchStrategyError unless player1[1].downcase == "p" or player1[1].downcase == "s" or player1[1].downcase == "r" 
raise NoSuchStrategyError unless player2[1].downcase == "p" or player2[1].downcase == "s" or player2[1].downcase == "r" 

있습니까 : 나는 그것이 작동하려면 다음과 같이 먼 길을 그것을 써야했다?

+0

당신이 할'만약 [ 'A', 'B', 'C']'에서 foo는.루비도이 일을 할 수 있는지 알고 싶습니다. – Blender

+0

@Blender 실제로 [Enumerable # include?] (http://ruby-doc.org/core-1.9.3/Enumerable.html#method-i-include-3F)를 통해 반전 만 가능합니다. '[ 'a', 'b', 'c']. 포함? foo'. (엄밀히 말하면 ['Array'는'include?를 오버라이드한다 '] (http://ruby-doc.org/core-1.9.3/Array.html#method-i-include-3F). –

+0

나는 깨달았다. 조금 늦었지 만 나는 다른 모든 책임을 가지고 수업의 모든 속도를 따라갈 수 있다고 생각하지 않는다. 나는 시간을 얻을 때 그것을 통해 일하려고 노력하고있다. – Calihan

답변

2

||이 truthy입니다 그것의 첫 번째 인수를 반환하기 때문입니다 . 이 경우 "p"이 사실이므로 ("p" || "r" || "s")항상"p"을 반환합니다. 블렌더는 파이썬에 대한 자신의 의견에 암시로

raise NoSuchStrategyError unless ((player1[1].downcase && player2[1].downcase) == "p" 

, 당신은 할 수 있습니다 :이를 알고, 첫 번째 문은 동등하게 같이 다시 작성할 수 있습니다 더 간결

raise NoSuchStrategyError unless ['p', 'r', 'y'].include?(player1[1].downcase) && ['p', 'r', 'y'].include?(player2[1].downcase) 

나 :

raise NoSuchStrategyError unless [player1[1].downcase, player2[1].downcase].all? { |c| %w[p r s].include? c } 

또한 Ruby에서 and & or을 사용할 때주의하시기 바랍니다. 이들은 &&과 다릅니다.||. 당신은 read more about the difference 일 수 있습니다. 당신의 접근 방식 ('p' || 'r' || 's')에서

1

이처럼 간단 수 :

raise NoSuchStrategyError unless (%w(a b c).include?(player1[1].downcase) && %w(a b c).include?(player2[1].downcase)) 

편집

더 간단한 해결책 :

raise NoSuchStrategyError if ("pry"[player1[1].downcase] || "pry"[player2[1].downcase]) 
+0

"[pry"[player1 [1] .downcase]가 멋지게 간략하더라도, "pry"를 사용하여 하나의 단일 세트를 대체 할 때 수행중인 작업의 의도 중 일부가 손실된다고 생각합니다. 문자. –

1

항상 nil 제외 루비 이후, 'P'반환하고 false 모든 true는 'P'를 제외하고, 따라서 0을 포함하고, 당신의 접근 방식은 실패합니다.


대신 Array#include? 메서드를 사용해보십시오.

plays = ['p', 'r', 's'] 

raise NoSuchStrategyError unless (plays.include?(player1[1].downcase) && 
            plays.include?(player2[1].downcase) 
           ) 
2

당신은 다만 수 : 당신이 그것을 구조화하는 방법

"pry".include?(player1[1].downcase) 

코드와 진짜 문제입니다. 그런 다음 라인을

class Player 

    def initialize(name) 
    @name = name 
    @strategy = "goofy" 
    end 

    def valid_strategy? 
    return "pry".include?(@strategy) 
    end 

end 

: 당신은 자신이 다음,이 변수와 함께 작동하도록 당신이 "플레이어"클래스를 선언 할 필요는 일반적으로 실마리를 반복 코드의 무리를 작성, 재생기, 그리고 player2 등의 변수를 선언 찾을 때 다음과 같습니다 : 파이썬에서

raise NoSuchStrategyError unless @player.valid_strategy? 
+1

또는 더 짧아서, "pry"[player1 [1] .downcase]' – pduersteler