RParsec の many と many_ の違い

2007/12/13 9:09am

前回の四則演算デモで真っ先に目を引いたのは many_ という奇妙な名前のメソッドだった。

delim = whitespace.many_

他にもっと注目すべきところがあるだろうと言われそうだが、非公開の関数か一時変数のようなメソッドが公開 API の一部というのに驚いた。

また、many_Parser クラスのメソッドだが、このクラスには他にも many というメソッドが用意されている。

両者の違いは何だろう?

many と many_ の違い

上記リンク先の API リファレンスによれば、

という違いだけのようだ。irb で実際に動作を確認してみよう。

% irb
irb(main):001:0> require 'rubygems'
irb(main):002:0> require 'rparsec'
irb(main):003:0> include Parsers

まずは必要な require や include を済ませておく。

irb(main):004:0> whitespace.many.parse("\t\r\n")
=> [9, 13, 10]
irb(main):005:0> whitespace.many_.parse("\t\r\n")
=> 10

many では引数で渡した文字列(タブと改行)の各文字が配列で返されるのにたいして、many_ では最後の改行文字のみが返されているのが確認できた。

irb(main):007:0> whitespace.many.parse("")
=> []
irb(main):006:0> whitespace.many_.parse("")
=> nil

ちなみに、一度もマッチしなかった場合は many では空の配列、many_ では nil が返されるようだ。