【发布时间】:2015-04-21 16:55:57
【问题描述】:
在我看来,以下三个示例在逻辑上是等价的,应该会产生相同的结果。
print "Enter your string: "
my_string = gets.chomp
#Example 1
my_string.include? ("j" or "J")
puts "1. Your string includes a j or J."
#Example 2
if
my_string.include? ("j" or "J")
puts "2. Your string includes a j or J."
end
#Example 3
if
my_string.include? ("j") or my_string.include? ("J")
puts "3. Your string includes a j or J."
end
这是带有大写 J 的结果。
Enter your string: Jack
1. Your string includes a j or J.
3. Your string includes a j or J.
这里是小写 j 的结果。
Enter your string: jack
1. Your string includes a j or J.
2. Your string includes a j or J.
3. Your string includes a j or J.
由于我不明白的原因,只有示例 1 和 3 产生了相同的结果。相比之下,在示例 2 中,仅评估括号中的第一项(小写 j)。
但是为什么呢?如果示例 1 完美运行,为什么示例 2 仅仅因为“包含”而失败?方法嵌套在“if/end”中?
如果我们需要将代码包装在“if/elsif/end”条件中,有没有办法在“包含”中列出要评估的多个值?不需要像示例 3 中那样单独写出它们的方法?如果要评估许多值,这将是乏味的 - 几乎是“反 Ruby”!
换句话说,有没有办法让示例 2 正常工作?
【问题讨论】:
-
让示例 2 工作的最简单方法可能是
my_string.downcase.include?('j') -
条件确实应该和
if在同一行。也可能是您涉足正则表达式的时候了:my_string.match(/[j]/i)将是您想要的,您可以在其中根据需要添加其他字母。 -
感谢@Tadman,这是一个明显的例子。很明显,包括?方法的局限性太大(例如,仅在要检查单个值的情况下才有用)。我扩展了您的建议如下(如示例 2b),它给了我我想要的东西:
if (my_string.chars & %w[ j J x y z]).any? puts "2b. Your string includes a j or J or x or y or z." end -
很高兴有帮助!如果您想匹配任意字符,则转换为:
my_string.match(/[jJyz]/)。这可能效率更高,尽管如果您不熟悉正则表达式可能很难阅读。
标签: ruby-on-rails ruby