-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

したがって、右側の式は「true」に解決されますが、変数usr_has_widgetは「false」に設定されています。usr_has_widget「true」に設定されないのはなぜですか?

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 を使用しています) の問題であり、文字列内のセミコロンが気に入らないようです (終了していない文字列が end of file エラーに遭遇します)。

したがって、上記の私の行では

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

Ruby インタープリターは、リテラルのバックスラッシュとそれに続くセミコロンを探しますが、私の場合、一致するものが見つからず、それに続く分割を適用しないため、「false」値が返されます (探しているウィジェットがセミコロンの両側)

ただし、デバッガーにドロップすると、エラーを回避するためにバックスラッシュを適用する必要があります。デバッガーはバックスラッシュを無視し、置換を適用し、次の分割が機能するため、「true」の結果が返されます。

したがって、Ruby デバッグ モードにあるか、コードがインタープリターの下で実行されているかによって、逆のブール値の結果が得られます。これにより、デバッグが非常に混乱します。

This SO answer は、デバッガーをより詳細に説明しています

于 2013-08-09T15:33:46.153 に答える