Ruby比较总是返回true

时间:2012-12-12 01:38:42

标签: ruby

我正在分析来自HTTP请求的响应代码,并根据该响应代码确定我如何记录该信息。问题是数据始终记录为true。例如,当我收到500响应代码时,我想记录失败。当我得到200时,我想要成功。但是,我总是取得成功。有人可以看看我的代码,或者告诉我我做错了什么,或者我能做些什么来解决它?

以下代码给我一个问题:

if response.code == "200" or "201" or "202" or "203" or "204"

我认为我传入一个字符串,所以当Ruby评估条件时,它返回true,但我尝试添加:.to_i(base=10)但没有成功。

非常感谢任何帮助。

5 个答案:

答案 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'不是nilfalse,所以{{1}}总是评估为真。

答案 4 :(得分:1)

正如其他人所说,你的条件会返回'201',因为这是一个“真实”值,非真值只有零和假。

一种方法可以是

if ['200','201','202','203','204'].include? response.code