通常,我会在块外声明变量,但不能声明MatchData变量。我可以通过查询比赛来做到这一点(例如foo = "hi".match(/hi/)
),但是感觉有点儿愚蠢?在Ruby中,我在块内捕获一些MatchData,但我需要块外的数据
编辑:问题被搁置,所以要清楚,我的目标是夺取一个块外的
.match
调用的结果。简单的答案是在块外部声明foo = nil
,因为您不需要定义var类型。使用的也是发现结果立即存储在$~
,$1
,$2
等。(对不起,这是一个有点补救!)
通常,我会在块外声明变量,但不能声明MatchData变量。我可以通过查询比赛来做到这一点(例如foo = "hi".match(/hi/)
),但是感觉有点儿愚蠢?在Ruby中,我在块内捕获一些MatchData,但我需要块外的数据
编辑:问题被搁置,所以要清楚,我的目标是夺取一个块外的
.match
调用的结果。简单的答案是在块外部声明foo = nil
,因为您不需要定义var类型。使用的也是发现结果立即存储在$~
,$1
,$2
等。(对不起,这是一个有点补救!)
当您在红宝石声明一个变量,你不” t需要申报其类型,你可以简单地说它是nil
,它应该工作得很好:
my_match = nil
"hi there".tap do |x|
my_match = x.match /hi/
end
puts my_match
# => hi
你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
您将需要提供一些更详细的信息,以了解您的问题/问题...... btw,我假设您发送foo =“hi”.match/hi/ – nPn 2014-11-22 02:49:46
显示您的代码。 – matt 2014-11-22 03:50:31