【发布时间】:2014-11-17 03:58:59
【问题描述】:
假设我有数组
s = ['Armando','P']
p s[1] == ('R' || 'P' || 'S')
虽然 P 包含在“OR”比较中,但它会返回 true,但它会返回 false
【问题讨论】:
-
查看stackoverflow.com/a/26765267/128421 了解逻辑的作用。
标签: ruby
假设我有数组
s = ['Armando','P']
p s[1] == ('R' || 'P' || 'S')
虽然 P 包含在“OR”比较中,但它会返回 true,但它会返回 false
【问题讨论】:
标签: ruby
因为它不是这样工作的。如果A 为真,A || B 的定义为A,否则为B。评估顺序与数学一样,括号在前;所以('R' || 'P' || 'S') 是'R'(因为至少它们中的第一个是真实的;事实上它们都是真实的)。那么'P' == 'R'显然是假的。
你需要写成:
s[1] == 'R' || s[1] == 'P' || s[1] == 'S'
更短的选择:
%w(R P S).include?(s[1])
【讨论】:
if 语句中,你也可以写成case s[i]; when 'R', 'P', 'S'; then....; else...; end。
问题在于表达式'R' || 'P' || 'S' 的计算结果为'R'(因为它是表达式中的第一个真值。显然'P' != 'R',这就是为什么完整的表达式计算结果为false。我会怎么做而是使用正则表达式:
# Revised regexp according to Cary Swoveland's recommendation:
!!s[1][/\A[RPS]\z/] #=> true
【讨论】:
true 或false。它们并不是真正需要的,但没有它们s[1] =~ /\A[RPS]\z/ #=> 0。如果要将零转换为 true 或将 nil 转换为 false,可以在表达式前面加上 !!(执行两次 boolean negation)。