我有以下代码行,调试器调用:
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'?
答案 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调试模式或代码是否在解释器下运行 - 使调试非常混乱!