よたらぼ
自分の興味の赴くままにIT技術系のネタを取りとめもなくメモっています。
Ruby言語やLinuxのネタが多いです。

September 26, 2003 [おもひで]

[Ruby] ObjectPool

Ian A. Marsmanという人が、使ったよー、というメールをくれた。

DBのコネクションプール用に使っている模様。2001/12/30にリリースして、2年掛けでユーザ登場(^^;)。

で、ちとコードを読み直してみたんだけど、これ、クラスじゃなくてモジュールの方が良いかなぁ。2年ぶりに手を入れるべきか...。

[Ruby] 2つの文字列の先頭から等しい文字列を抜き出す

例えば、abcとabcdefという2つの文字列があったら、abcを返す。マッチしなかったら空文字を返す。

  def match_first(a, b)
    ret = ""
    (0...a.size).each do |i|
      break unless a[i] == b[i]
      ret << a[i]
    end
    ret
  end
   
  puts match_first("abc", "abcdef")        #=> "abc"
  puts match_first("abc", "abc")           #=> "abc"
  puts match_first("abc", "fabcd")         #=> ""
  puts match_first("あいう", "あいうえ")   #=> "あいう"

なんか、もちっとエレガントな書き方ないかな。ひょっとして正規表現一発で書けちゃったりする?

本日のツッコミ(全2件) [ツッコミを入れる]
kzys (September 27, 2003 11:39)

正規表現二発でやってみました。

def match_first(a, b)
  if a =~ /^(#{Regexp.escape(b)})/ or b =~ /^(#{Regexp.escape(a)})/
    $1
  else
    return ''
  end
end

さかい (September 27, 2003 13:25)

def match_first(a,b)
  a = a.split(//)
  b = b.split(//)
  l = [a.length, b.length].min
  a[0, (0...l).find{|i| a[i] != b[i] } || l].join('')
end


編集