longest match

Enumerable#injectを使ってみた。

require 'strscan'

def longest_match(scanner, res)
  sz,regexp = res.inject([0,nil]) {|(sz,regexp),re|
    x = scanner.match?(re)
    (x ||= 0) > sz ? [x,re] : [sz,regexp]
  }
  yield(regexp, regexp ? scanner.scan(regexp) : nil)
end

longest_match(StringScanner.new("iffff"), [/if/, /[a-z]+/]) {|re,tkn| tkn }   => "iffff"
longest_match(StringScanner.new("if"), [/if/, /[a-z]+/]) {|re,tkn| tkn }      => "if"
longest_match(StringScanner.new("12345"), [/if/, /[a-z]+/]) {|re,tkn| tkn }   => nil

きれいになったようななってないような。代入が消えたのは喜ばしいが、多値の取り扱いで、ちょっと許せない感じ。

※同じく修正