-1

我有以下代码行,带有调试器调用:

usr_has_widget = usr_wid_list.wlist.gsub('\;', ',').split(",").include?(widget.widget_name)
debugger

我的应用程序在调试模式下停止,我得到以下信息:

(rdb:11) usr_has_widget
false
(rdb:11) usr_wid_list.wlist.gsub('\;', ',').split(",").include?(widget.widget_name)
true

所以右手表达式解析为“真”,但变量usr_has_widget被设置为“假”。为什么不usr_has_widget设置为“真”?

4

2 回答 2

2

这里有一些需要考虑的事情。

从...开始:

str = "doweighin;domeasurements,weightplot"
str.gsub(';', ',').split(',') # => ["doweighin", "domeasurements", "weightplot"]
str.gsub(';', ',').split(',').include?('weightplot') # => true

.gsub(';', ',').split(',')虽然使用是愚蠢的,当split让我们使用正则表达式时:

str.split(/[;,]/) # => ["doweighin", "domeasurements", "weightplot"]

如果目标词或搜索词的大小写不同,则存在一个小问题,即搜索将失败:

str.split(/[;,]/).include?('WeightPlot') # => false

您可以通过在进行测试之前将外壳折叠为大写或小写来解决此问题:

str.downcase.split(/[;,]/).include?('WeightPlot'.downcase) # => true

不过,有一些更短的方法可以进行测试:

str['weightplot'] # => "weightplot"

它只是进行字符串内搜索。如果您要查找的字符串在另一个字符串中找到,这可能会返回误报。

str[/\bWeightPlot\b/i] # => "weightplot"

它使用正则表达式来查找单词,忽略大小写,并要求它的两侧都有单词边界。

与其硬编码目标字符串,不如使用字符串插值在运行时插入它:

target = 'WeightPlot'
str[/\b#{ target }\b/i] # => "weightplot"

您可以使用 将快捷方式的结果转换为布尔值 true/false !!。“not-not”是将nil结果变为 false 并将其他任何内容变为 true 的好方法:

!!str['weightplot'] # => true
!!str[/\bWeightPlot\b/i] # => true
于 2013-08-06T22:15:48.983 回答
0

这是 Ruby 调试器的问题(我在 Rails 3.2.11 中使用 ruby​​-debug19),它似乎不喜欢字符串中的分号(抛出未终止的字符串遇到文件结尾错误)。

因此在我上面的行中

usr_wid_list.wlist.gsub('\;', ',').split(",").include?(widget.widget_name)

Ruby 解释器将查找文字反斜杠后跟分号,在我的情况下找不到匹配项,然后不应用它后面的拆分,从而返回一个“假”值(如果我正在寻找的小部件是分号的任一侧)

但是,进入调试器,您必须应用反斜杠以避免错误,调试器忽略反斜杠,应用替换并且以下拆分工作 - 从而返回“真”结果

因此,根据您是处于 ruby​​ 调试模式还是代码在解释器下运行,您会得到相反的布尔结果——这使得调试非常混乱!

这个 SO answer 更详细地描述了调试器

于 2013-08-09T15:33:46.153 回答