“条件字符串文字”是什么意思?

时间:2014-02-04 15:36:10

标签: ruby string conditional-statements literals

每当我尝试运行该程序时,会弹出一个错误,说“条件中的字符串文字(第10行)”。我做错了什么?

puts "Welcome to the best calculator there is. Would you like to (a) calculate the area of a geometric shape or (b) calculate the equation of a parabola? Please enter an 'a' or a 'b' to get started."
response = gets.chomp

if response == "a" or "A"

       puts "ok."

elsif response == "b" or "B"

       puts "awesome."

else

       puts "I'm sorry. I did not get that. Please try again."

end

4 个答案:

答案 0 :(得分:17)

您必须在or的两侧指定完整条件。

if response == "a" or response == "A"

or的两边没有连接; Ruby根据左边的内容不做任何关于右边的假设。如果右侧是裸字符串"A",那么除falsenil之外的任何内容都被视为“真”,因此整个表达式始终评估为“真”。但Ruby注意到它是一个字符串而不是一个布尔值,怀疑你可能没有指定你的意思,因此在问题中发出警告。

您还可以使用case表达式,使针对单个值进行多次测试变得更加简单;如果您在单个when中提供多种可能性的列表,则它们实际上or在一起:

case response
  when "a","A"
    puts "ok"
  when "b","B"
    puts "awesome."
  else
    puts "I'm sorry. I did not get that.  Please try again."
end

对于忽略字母大小写的具体情况,您还可以在测试之前转换为上限或下限:

case response.upcase 
  when "A"
    puts "ok"
  when "B"
    puts "awesome."
  else
    puts "I'm sorry, I did not get that.  Please try again."
 end

答案 1 :(得分:2)

句法上没有错;从某种意义上讲它是无用的,这是错误的。表达式response == "a" or "A"被解释为(response == "a") or "A",由于"A",它始终是真实的,因此将其置于条件中是没用的。

答案 2 :(得分:2)

if response == "a" or "A"相当于if (response == "a") or "A"。而“A”是一个字符串文字,这就是红宝石翻译抱怨的原因。

答案 3 :(得分:2)

这不是错误,而是警告。

你有条件

response == "a" or "A"

好吧,response == "a"truefalse。如果是true,则条件会降低到

true or "A"

true

如果是false,则条件会降至

false or "A"

"A"

truthy ,因为除falsenil之外的所有内容都是真实的。

因此,无论response的内容如何,​​条件总是为真。

这就是警告警告你的内容:字符串文字总是真实的,在某种情况下使用它们是没有意义的。