2014-11-22 25 views
1

通常,我会在块外声明变量,但不能声明MatchData变量。我可以通过查询比赛来做到这一点(例如foo = "hi".match(/hi/)),但是感觉有点儿愚蠢?在Ruby中,我在块内捕获一些MatchData,但我需要块外的数据

编辑:问题被搁置,所以要清楚,我的目标是夺取一个块外的.match调用的结果。简单的答案是在块外部声明foo = nil,因为您不需要定义var类型。使用的也是发现结果立即存储在$~$1$2等。(对不起,这是一个有点补救!)

+1

您将需要提供一些更详细的信息,以了解您的问题/问题...... btw,我假设您发送foo =“hi”.match/hi/ – nPn 2014-11-22 02:49:46

+1

显示您的代码。 – matt 2014-11-22 03:50:31

回答

1

当您在红宝石声明一个变量,你不” t需要申报其类型,你可以简单地说它是nil,它应该工作得很好:

my_match = nil 
"hi there".tap do |x| 
    my_match = x.match /hi/ 
end 
puts my_match 
# => hi 
0

你can'd做MatchData.new如果这就是你的意思,红宝石报告未定义的方法' new“为MatchData::Class。为什么?因为在本质上,MatchData is a variable

MatchData是特殊变量$〜类型,并且是由 正则表达式匹配#和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 
相关问题