我的预期结果为=~
,但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>
答案 0 :(得分:1)
这本身不是内存引用,它是对象ID,它是IRB显示未定义inspect
或to_s
方法的对象的方式。基本Object.to_s
方法的输出就是您所看到的。
显示的对象是match
的结果,每次使用该方法时都会重新创建。
答案 1 :(得分:1)
@theTinMan大多是正确的,引用是对象的to_s
或inspect
方法的输出(IRB只是调用它,而Object
的实现是通过继承使用的,如果它没有过度了)
=~
方法返回匹配位置,因为它是如何定义的。 MatchData
对象实际上是一个更丰富的对象,它具有匹配的信息,例如偏移量(位置),任何捕获等。实际上,您可以使用返回的MatchData
来访问值$~
,$1
,$2
等变量通常具有更清晰的界面。
MatchData
的文档:http://apidock.com/ruby/MatchData