Abbrev 모듈

Abbrev 모듈

주어진 문자열 집합에서 모호하지 않은 약어 집합을 계산해 주는 모듈이에요.

require 'abbrev'
require 'pp'

pp Abbrev.abbrev(['ruby'])
#=>  {"ruby"=>"ruby", "rub"=>"ruby", "ru"=>"ruby", "r"=>"ruby"}

pp Abbrev.abbrev(%w{ ruby rules })

위 코드는 이렇게 생성해요.

{ "ruby"  =>  "ruby",
  "rub"   =>  "ruby",
  "rules" =>  "rules",
  "rule"  =>  "rules",
  "rul"   =>  "rules" }

배열 코어 확장인 Array#abbrev도 제공해요.

pp %w{ summer winter }.abbrev

이 코드는 이렇게 생성해요.

{ "summer"  => "summer",
  "summe"   => "summer",
  "summ"    => "summer",
  "sum"     => "summer",
  "su"      => "summer",
  "s"       => "summer",
  "winter"  => "winter",
  "winte"   => "winter",
  "wint"    => "winter",
  "win"     => "winter",
  "wi"      => "winter",
  "w"       => "winter" }

출처: Ruby 3.3 API

Public Class Methods

abbrev(words, pattern = nil)

문자열 집합이 주어지면 그 문자열들의 모호하지 않은 약어 집합을 계산하고, 키가 가능한 모든 약어이고 값이 전체 문자열인 해시를 반환해요.

그래서 주어진 단어가 "car""cone"이라면, "car"를 가리키는 키는 "ca""car"이고, "cone"을 가리키는 키는 "co", "con", "cone"이 돼요.

require 'abbrev'

Abbrev.abbrev(%w{ car cone })
#=> {"ca"=>"car", "con"=>"cone", "co"=>"cone", "car"=>"car", "cone"=>"cone"}

선택적인 pattern 파라미터는 패턴(Regexp) 또는 문자열이에요. 패턴에 매칭되거나 문자열로 시작하는 입력 문자열만 결과 해시에 포함돼요.

Abbrev.abbrev(%w{car box cone crab}, /b/)
#=> {"box"=>"box", "bo"=>"box", "b"=>"box", "crab" => "crab"}

Abbrev.abbrev(%w{car box cone}, 'ca')
#=> {"car"=>"car", "ca"=>"car"}
# File lib/abbrev.rb, line 74
def abbrev(words, pattern = nil)
  table = {}
  seen = Hash.new(0)

  if pattern.is_a?(String)
    pattern = /\A#{Regexp.quote(pattern)}/  # regard as a prefix
  end

  words.each do |word|
    next if word.empty?
    word.size.downto(1) { |len|
      abbrev = word[0...len]

      next if pattern && pattern !~ abbrev

      case seen[abbrev] += 1
      when 1
        table[abbrev] = word
      when 2
        table.delete(abbrev)
      else
        break
      end
    }
  end

  words.each do |word|
    next if pattern && pattern !~ word

    table[word] = word
  end

  table
end

더 알아보기

  • Array#abbrev 확장으로 배열에서 바로 약어를 계산할 수 있어요.