-3

では期待どおりの結果が得られまし=~たが、ではありませんでしたmatchmatch実際の一致データではなくメモリ参照を提供するのはなぜ"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であり、inspectまたはto_sメソッドを定義しないオブジェクトをIRBが表示する方法です。基本Object.to_sメソッドの出力は、表示されているものです。

表示されているオブジェクトはmatch、メソッドを使用するたびに作成され、再作成されます。

于 2013-01-18T07:51:19.480 に答える
1

@theTinMan はほとんど正しいです。参照はオブジェクトのto_sまたはinspectメソッドの出力です (IRB はそれを呼び出すだけで、Object上書きされていない場合は継承によって実装が使用されます)。

この=~メソッドは一致位置を返します。これは、そのように定義されているためです。MatchDataオブジェクトは、実際には、オフセット (位置)、キャプチャなどの一致に関する情報を持つより豊富なオブジェクトです。本質的に、返された を使用して、、、 などの変数が通常保持するMatchData値にアクセスできます。 、より明確なインターフェースを備えています。$~$1$2

のドキュメントMatchData: http://apidock.com/ruby/MatchData

于 2013-01-18T08:05:38.527 に答える