为什么我不能根据表达式的结果设置变量?

时间:2013-08-06 20:47:23

标签: ruby-on-rails ruby

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

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

因此右手表达式正在解析为'true',但变量usr_has_widget被设置为'false'。为什么usr_has_widget没有设置为'true'?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

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

因此在我的上面

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

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

然后,放入调试器,你必须应用反斜杠以避免错误,调试器忽略反斜杠,应用替换和以下拆分工作 - 从而返回'true'结果

因此,您获得相反的布尔结果取决于您是否处于ruby调试模式或代码是否在解释器下运行 - 使调试非常混乱!

This SO answer describes the debugger in more detail