RParsec の many と many_ の違い
前回の四則演算デモで真っ先に目を引いたのは many_
という奇妙な名前のメソッドだった。
delim = whitespace.many_
他にもっと注目すべきところがあるだろうと言われそうだが、非公開の関数か一時変数のようなメソッドが公開 API の一部というのに驚いた。
また、many_ は Parser クラスのメソッドだが、このクラスには他にも many というメソッドが用意されている。
両者の違いは何だろう?
many と many_ の違い
上記リンク先の API リファレンスによれば、
- many は複数回マッチしたそれぞれの結果を配列で返し、
- many_ は最後にマッチした結果のみを返す
という違いだけのようだ。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 が返されるようだ。