【问题标题】:Why doesn't this comparison approach work in Ruby为什么这种比较方法在 Ruby 中不起作用
【发布时间】:2014-11-17 03:58:59
【问题描述】:

假设我有数组

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

虽然 P 包含在“OR”比较中,但它会返回 true,但它会返回 false

【问题讨论】:

标签: ruby


【解决方案1】:

因为它不是这样工作的。如果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
【解决方案2】:

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

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

【讨论】:

  • 这会将真/假值转换为truefalse。它们并不是真正需要的,但没有它们s[1] =~ /\A[RPS]\z/ #=> 0。如果要将零转换为 true 或将 nil 转换为 false,可以在表达式前面加上 !!(执行两次 boolean negation)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-15
  • 2013-07-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多