在Ruby中,我在块中捕获了一些MatchData,但我需要块外的数据

时间:2014-11-22 02:12:59

标签: ruby

通常,我会在块外面声明变量,但是你不能声明一个MatchData变量。我可以通过查询匹配(例如foo = "hi".match(/hi/))来做到这一点,但这感觉有点傻吗?

  

编辑:问题被搁置,所以要明确,我的目标是捕获一个块外.match调用的结果。简单的答案是在块外面声明foo = nil,因为您不需要定义var类型。同样有用的是发现结果立即存储在$~$1$2等等。(抱歉,这有点补救!)

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