为什么这种比较方法不适用于Ruby

时间:2014-11-17 03:59:00

标签: ruby

假设我有阵列

s = ['Armando','P']
p s[1] ==  ('R' || 'P' || 'S')

我认为这会返回true,因为P包含在“OR”比较中,但它返回false

2 个答案:

答案 0 :(得分:2)

因为它不是如何运作的。 A || B的定义为A,如果A是真实的,则B。评估顺序与数学一样,括号先行;所以('R' || 'P' || 'S')'R'(因为至少第一个是真实的;实际上所有都是真的)。然后'P' == 'R'显然是假的。

你需要把它写成:

s[1] == 'R' || s[1] == 'P' || s[1] == 'S'

更短的选择:

%w(R P S).include?(s[1])

答案 1 :(得分:1)

问题在于表达式'R' || 'P' || 'S'的计算结果为'R'(因为它是表达式中的第一个真值。显然是'P' != 'R',这就是整个表达式求值为false的原因。我要做的是改为使用正则表达式:

# Revised regexp according to Cary Swoveland's recommendation:
!!s[1][/\A[RPS]\z/]  #=> true