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
きれいになったようななってないような。代入が消えたのは喜ばしいが、多値の取り扱いで、ちょっと許せない感じ。
※同じく修正