Это потому, что ||
возвращает первый правдивый аргумент.В этом случае, поскольку "p"
является правдой, ("p" || "r" || "s")
всегда возвращает "p"
.Зная это, ваше первое утверждение может быть эквивалентно переписано как:
raise NoSuchStrategyError unless ((player1[1].downcase && player2[1].downcase) == "p"
Как намекал Блендер в своем комментарии о Python, вы можете сделать:
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 }
Кроме того, будьте осторожны при использовании and
& or
в Ruby, они отличаются от &&
& ||
.Вы можете (и должны) узнать больше о разнице .