通常、私は変数をブロックの外で宣言しますが、MatchData変数を宣言することはできません。一致をクエリすることでそれを行うことができます(例: foo = "hi".match(/hi/)
)しかし、それはちょっと間抜けな感じですか?
編集: 質問は保留されたため、明確にするために、私の目的は
.match
ブロックの外で呼び出します。簡単な答えは宣言することでしたfoo = nil
var型を定義する必要がないため、ブロックの外側にあります。また、結果がすぐに$~
,$1
,$2
など(申し訳ありませんが、これは少し改善されました!)
回答:
回答№1は1Rubyで変数を宣言するとき、その型を宣言する必要はありません。単に nil
そしてそれはうまくいくはずです。
my_match = nil
"hi there".tap do |x|
my_match = x.match /hi/
end
puts my_match
# => hi
回答№2の場合は0
あなたはできる MatchData.new
それがあなたの意味するところなら、Rubyは未定義のメソッドを報告します」new
" にとって MatchData::Class
。どうして?なぜなら、本質的に、 MatchDataは変数です:
MatchDataは、特殊変数$〜のタイプです。そしてのタイプです Regexp#matchおよびRegexp.last_matchによって返されるオブジェクト。それ パターンマッチのすべての結果をカプセル化し、通常の結果 特殊変数$&、$ "、$`、$ 1、$ 2などを介してアクセスされます。
これを試して:
"string" =~ /s(tr)(ing)/
p $~ #=> #<MatchData "string" 1:"tr" 2:"ing">
p $1 #=> tr
p $2 =#> ing
matchデータ変数をより読みやすいものに参照する場合は、次のようにします。
"string" =~ /s(tr)(ing)/
foo = $~
p foo #=> #<MatchData "string" 1:"tr" 2:"ing">
p foo == $~ #=> true