我正在分析来自HTTP请求的响应代码,并根据该响应代码确定我如何记录该信息。问题是数据始终记录为true。例如,当我收到500响应代码时,我想记录失败。当我得到200时,我想要成功。但是,我总是取得成功。有人可以看看我的代码,或者告诉我我做错了什么,或者我能做些什么来解决它?
以下代码给我一个问题:
if response.code == "200" or "201" or "202" or "203" or "204"
我认为我传入一个字符串,所以当Ruby评估条件时,它返回true,但我尝试添加:.to_i(base=10)
但没有成功。
非常感谢任何帮助。
答案 0 :(得分:8)
正如已经提到的,它的if语句:if response.code == "200" or "201" or "202" or "203" or "204"
优雅的解决方案是:
if ('200'..'204').include? response.code
答案 1 :(得分:5)
问题在于使用or
。有关or
和||
之间差异的详细说明,请参阅http://www.coshx.com/blog/2012/10/31/rubys-and-and-or-operators-explained,但此处的问题更为基本。就像你写的那样
if response.code == "200" or true
始终评估为true
。您需要将其更改为
if response.code == "200" or response.code == "201" or ...
答案 2 :(得分:4)
错误就是这个表达式
response.code == "200" or "201" or "202" or "203" or "204"
如果响应代码为'200',则返回true
如果响应代码为“201”,则返回“201”
如果响应代码为'500',它也将返回'201'
如果要将响应代码的开头与20匹配,可以使用regex或start_with吗?方法
例如response.code =~ /^20\d$/
或response.code.start_with?('20')
答案 3 :(得分:3)
如果您想针对多个可能的值进行测试,您可以使用多种方法,每种方法都有其优点和缺点。
当列表小并且未必事先知道时,使用include?
对范围或列表进行测试是合适的。更好的版本使用Hash代替数组,因为对于超过10个条目的任何内容,哈希中的查找时间通常要快得多。记住阵列是从开始到匹配扫描的,在最坏的情况下意味着测试每个元素的等价性。
更多固定逻辑的更好方法是case
:
case (response.code)
when '200', '201', '202', '203', '204'
# ...
else
# ...
end
这些都经过优化并且执行速度惊人。它们也足够灵活,可以处理各种匹配类型。在你的情况下,由于你已经拼写出逻辑,这可能是最接近它的模拟。
请注意,x == 'a' or 'b'
相当于(x == 'a') or 'b'
,因为'b'
不是nil
或false
,所以{{1}}总是评估为真。
答案 4 :(得分:1)
正如其他人所说,你的条件会返回'201',因为这是一个“真实”值,非真值只有零和假。
一种方法可以是
if ['200','201','202','203','204'].include? response.code