大阪弁変換のメソッドを String クラスに追加する

Ruby では、文字列は String クラスに属するらしく、しかもなんとその String クラスに簡単にメソッドを追加できるようなので「to_osaka」というメソッドを追加して

str = '文字列'
puts str.to_osaka

これで文字列が大阪弁に変換されて表示されるようにしたい!と思ったので作ってみました。
コードは下記のような感じになりました。

class String
  def to_osaka
    str = self
    load_osaka_dic
    @osakadic.each do |key, value|
      str.gsub!(key, value)
    end
    return str
  end

  private

  def load_osaka_dic
    @osakadic = {}
    open('osaka.dic') { |f|
      f.each_line { |l|
        if l.chomp.length > 0
          words = l.chomp.split(/ /)
          @osakadic[words[0]] = words[1]
        end
      }
    }
  end
end

hyoujyun = 'Rubyを勉強しているのですが、なかなか思うように動かなくて、どうしていいものかわかりません。毎日ちょっとずつ進めていきたいと思っているのでどうぞ宜しくお願いします。'

puts hyoujyun.to_osaka

今回は大阪弁http://www.vector.co.jp/soft/dos/amuse/se003170.html こちらにあるソフトに同封されている辞書を使わせて頂きました。このファイルには「ありがとうございます おおきに」という感じに、1行に1つ「単語 訳」が書いてあります。to_osaka が呼ばれると、まず load_osaka_dic というメソッドが呼ばれて、辞書の内容を @osakadic (ハッシュにしました)というパッケージ変数に読み込みます。

@osakadic['ありがとうございます'] = 'おおきに'

こんな感じですね。ちなみにこの load_osaka_dic はプライベートメソッドを定義しました。Ruby のクラスでプライベートメソッドを定義するには private と書いて、その下にメソッドを定義すればそれがプライベートメソッドになるようなのだ。

そして @osakadic 内に入った key と value を @osakadic.each で1つ1つ置換していきます。置換には gsub! というメソッドを使用しました。replace じゃなくて gsub! みたいです。replace は文字列全部を置換する用らしい。gsub はその文字列自体は変換しませんが、gsub! はその文字列自体を変換するらしい。なので

str1 = 'foobarbaz'
str1.gsub(/foo/, 'bar') 
puts str1

str2 = 'foobarbaz'
str2.gsub(/foo/, 'bar')
puts str2

こうやると

foobarbaz

barbarbaz

となります。

話が逸れましたが、このような gsub! メソッドを使って辞書内すべての単語と置換したら、それを返します。これでだけです。

実行結果は、こんな感じです。

Rubyを勉強しとるのやけどアンタ、なかなか思うように動かなくて、どうしてええものかわかりまへん。毎日ちーとばかしずつ進めていきたいと思っとるのでどうぞ宜しくお願いしまんねん。

出たーーーーーー。でも、なんか大阪のおっさんみたいな口調になってしまいました…。まぁいいか。。。