/ / Rubyでは、ブロック内でいくつかのMatchDataをキャプチャしていますが、ブロック外のデータが必要です[クローズ]-ruby

Rubyでは、ブロック内のMatchDataをキャプチャしていますが、ブロック外のデータが必要です。[closed] - ruby

通常、私は変数をブロックの外で宣言しますが、MatchData変数を宣言することはできません。一致をクエリすることでそれを行うことができます(例: foo = "hi".match(/hi/) )しかし、それはちょっと間抜けな感じですか?

編集: 質問は保留されたため、明確にするために、私の目的は .match ブロックの外で呼び出します。簡単な答えは宣言することでした foo = nil var型を定義する必要がないため、ブロックの外側にあります。また、結果がすぐに $~, $1, $2 など(申し訳ありませんが、これは少し改善されました!)

回答:

回答№1は1

Rubyで変数を宣言するとき、その型を宣言する必要はありません。単に 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