为什么`match`给出了内存引用而不是实际匹配数据`“foo”`?

时间:2013-01-18 07:49:21

标签: ruby regex

我的预期结果为=~,但match没有。为什么match会提供内存引用而不是实际匹配数据"foo"?为什么引用会在同一语句的每次运行中发生变化?

s= "foo"
/(?=foo)foo/ =~ s    # => 0
/(?=foo)foo/.match s # => #<MatchData:0x2e6a490>
/(?=foo)foo/.match s # => #<MatchData:0x2e66390>
/(?=foo)foo/.match s # => #<MatchData:0x2e64310>

2 个答案:

答案 0 :(得分:1)

这本身不是内存引用,它是对象ID,它是IRB显示未定义inspectto_s方法的对象的方式。基本Object.to_s方法的输出就是您所看到的。

显示的对象是match的结果,每次使用该方法时都会重新创建。

答案 1 :(得分:1)

@theTinMan大多是正确的,引用是对象的to_sinspect方法的输出(IRB只是调用它,而Object的实现是通过继承使用的,如果它没有过度了)

=~方法返回匹配位置,因为它是如何定义的。 MatchData对象实际上是一个更丰富的对象,它具有匹配的信息,例如偏移量(位置),任何捕获等。实际上,您可以使用返回的MatchData来访问值$~$1$2等变量通常具有更清晰的界面。

MatchData的文档:http://apidock.com/ruby/MatchData