1

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

这是给我一个问题的代码:

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

我考虑过我正在传递一个字符串,因此当 Ruby 评估条件时,它返回 true,但我尝试添加:但.to_i(base=10)没有成功。

任何帮助将不胜感激。

4

5 回答 5

8

如前所述,它的 if 语句:if response.code == "200" or "201" or "202" or "203" or "204"

一个优雅的解决方法是:

if ('200'..'204').include? response.code
于 2012-12-12T01:50:11.700 回答
5

问题在于使用or. 请参阅http://www.coshx.com/blog/2012/10/31/rubys-and-and-or-operators-explained以更详细地解释和之间的区别or||但这里的问题更加基本。好像你写的

if response.code == "200" or true

这将始终评估为true. 您需要将其更改为

if response.code == "200" or response.code == "201" or ...
于 2012-12-12T01:47:09.827 回答
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')

于 2012-12-12T01:47:06.133 回答
3

当您想针对多个可能的值进行测试时,您有多种方法,每种方法都有其优点和缺点。

当列表很小并且不一定事先知道时,对范围或列表进行测试include?是合适的。更好的版本使用 Hash 代替 Array,因为对于超过 ~10 个条目的任何内容,Hash 中的查找时间通常要快得多。请记住,数组是从开始扫描到匹配的,这在最坏的情况下意味着测试每个元素的等价性。

更固定逻辑的更好方法是case

 case (response.code)
 when '200', '201', '202', '203', '204'
   # ...
 else
   # ...
 end

这些都经过优化并且执行速度惊人。它们也足够灵活,可以处理各种匹配类型。在您的情况下,由于您已经阐明了逻辑,因此这可能是最接近有效的模拟。

请记住,x == 'a' or 'b'等价于(x == 'a') or 'b'which 将始终评估为 true,因为'b'is notnilfalse

于 2012-12-12T05:09:28.787 回答
1

正如其他人所说,您的条件返回“201”,因为这是一个“真”值,非真值只有 nil 和 false。

一种方法可能是

if ['200','201','202','203','204'].include? response.code
于 2012-12-12T01:53:36.333 回答