-3

我得到了预期的结果,=~但没有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>
4

2 回答 2

1

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

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

于 2013-01-18T07:51:19.480 回答
1

@theTinMan 大部分是正确的,引用是对象to_sinspect方法的输出(IRB 只是调用它,Object如果没有被覆盖,则通过继承使用 ' 的实现)

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

文档MatchDatahttp ://apidock.com/ruby/MatchData

于 2013-01-18T08:05:38.527 回答