每当我尝试运行该程序时,会弹出一个错误,说“条件中的字符串文字(第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
答案 0 :(得分:17)
您必须在or
的两侧指定完整条件。
if response == "a" or response == "A"
or
的两边没有连接; Ruby根据左边的内容不做任何关于右边的假设。如果右侧是裸字符串"A"
,那么除false
或nil
之外的任何内容都被视为“真”,因此整个表达式始终评估为“真”。但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"
是true
或false
。如果是true
,则条件会降低到
true or "A"
是
true
如果是false
,则条件会降至
false or "A"
是
"A"
truthy ,因为除false
和nil
之外的所有内容都是真实的。
因此,无论response
的内容如何,条件总是为真。
这就是警告警告你的内容:字符串文字总是真实的,在某种情况下使用它们是没有意义的。