通常,我会在块外面声明变量,但是你不能声明一个MatchData变量。我可以通过查询匹配(例如foo = "hi".match(/hi/)
)来做到这一点,但这感觉有点傻吗?
编辑:问题被搁置,所以要明确,我的目标是捕获一个块外
.match
调用的结果。简单的答案是在块外面声明foo = nil
,因为您不需要定义var类型。同样有用的是发现结果立即存储在$~
,$1
,$2
等等。(抱歉,这有点补救!)
答案 0 :(得分:1)
当您在ruby中声明变量时,您不需要声明其类型,您可以简单地说它是nil
,它应该可以正常工作:
my_match = nil
"hi there".tap do |x|
my_match = x.match /hi/
end
puts my_match
# => hi
答案 1 :(得分:0)
你可以MatchData.new
如果这是你的意思,Ruby会报告未定义的方法' new
'为MatchData::Class
。为什么?因为,实质上,MatchData is a variable:
MatchData是特殊变量$〜的类型,是类型 Regexp #matre和Regexp.last_match返回的对象。它 封装模式匹配的所有结果,结果通常 通过特殊变量$&,$',$`,$ 1,$ 2等访问。
试试这个:
'string' =~ /s(tr)(ing)/
p $~ #=> #<MatchData "string" 1:"tr" 2:"ing">
p $1 #=> tr
p $2 =#> ing
如果您想将匹配数据变量引用为更具可读性的内容,请执行以下操作:
'string' =~ /s(tr)(ing)/
foo = $~
p foo #=> #<MatchData "string" 1:"tr" 2:"ing">
p foo == $~ #=> true