polyglotって?

なんとなく Rails3を勉強してみようかな、とインストール後、ふと目に入った polyglotが気になる*1
英語の意味としては多国語(を解する人、で書かれた文)的な意味なんだけど、これなに?

customez require

と調べてみると、requireを拡張して、ファイルの拡張子に応じた動作をカスタマイズできるライブラリらしい。

ローダを作る

例えば .helloファイルをrequireするときは


helloloader.rb

require 'polyglot'

class HelloLoader
  def self.load(filename, options = nil, &block)
    File.open(filename).readlines.to_a.each { |line|
      line.rstrip!
      puts "Hello to the #{line}!!"
    }
  end
end

Polyglot.register("hello", HelloLoader)

てな感じに.loadを持ったローダークラスを作ってPolyglot.registerで登録。大変簡単!
こんなのも作ってみる。

yamlloader.rb

require 'polyglot'

require 'yaml'

class YamlLoader
  def self.load(filename, options = nil, &block)
    $CONFIG = YAML.load(File.open(filename).read)
  end
end

Polyglot.register("yaml", YamlLoader)

作ったローダを使ってみる

で、


main.rb -

# load polygloter
require 'helloloader'
require 'yamlloader'

# do it
require 'greeting'
require 'config'

# display result of YAMLloader
puts $CONFIG

# finished!
puts "finished!!"

あとは .helloファイルと yamlファイルを作って


greeting.hello

neighbors
country
world
galaxy
universe


config.yaml

person:
- {name: "Smith", age: 24}
- {name: "Kim", age: 21}
- {name: "Mike", age: 12}
- {name: "Horland", age: 11}

実行!

sawshark% ruby -I. main.rb
Hello to the neighbors!!
Hello to the country!!
Hello to the world!!
Hello to the galaxy!!
Hello to the universe!!
{"person"=>[{"name"=>"Smith", "age"=>24}, {"name"=>"Kim", "age"=>21}, {"name"=>"Mike", "age"=>12}, {"name"=>"Horland", "age"=>11}]}
finished!!

ふむ。

どこで使ってんだろう

かと思って調べてみたら、actionmailer -> mail -> treetopだった。なるほど

結論

で、treetopって何(ループ)*2

*1:きっと僕が神林ファンのせいです

*2:構文解析らしい。こっちの方が面白そう。チョイスオペレータが/(スラッシュ)ってのがキモイけど