AngularJSというものを眺めていたらその中にビューテンプレートなどで使えるフィルターという概念がでてきて、あーこれLiquidにもあったけどUNIXのパイプラインみたいで面白いなあRubyでできないかなあ、ということでちょっと試してみましたという内容の投稿です。

まあ、メソッドチェーンでいいよ、って話で終わりなんですが。

AngulraJSのFilterというのはビューテンプレートの中で、

{{ 12 | currency  }}

のようにすると、12currencyフィルタを通って$12.00が出力されるといった代物です。

{{ expression | filter1 | filter2 | filter3  }}

のように複数のフィルタを順次適用することもできます。まさにパイプですね。

Rubyでパイプ?

でこんな感じのものをRubyで書いてみました。

そうすると、こんな風に書けるようになります。

require "./filter"
using CoreExt

puts 'hello' | :upcase

# >> HELLO

puts 123 | :next

# >> 124

もちろんチェーンもできます。

puts 'Mississippi' | :upcase | :squeeze | :chars | :reverse

# >> ["I", "P", "I", "S", "I", "S", "I", "M"]

puts 123 | :next | :even?

# >> true

Filter.addを使って新たなフィルターを追加できます。

Filter.add :currency do |int|
  raise ArgumentError unless int.is_a?(Numeric)
  "$%.2f" % int
end

puts 123.45 * 3 | :currency

# >> $370.35

Filter.add :titleize do |str|
  str.scan(/\w+/).map(&:capitalize)*' '
end

puts 'ruby on rails' | :titleize

# >> Ruby On Rails

でも引数取れないんですorz..


(追記:2014-03-06)

引数取れないと泣いていたらyouz(@Yubeshi)さんが書いてくれましたよ、配列使って!

配列は気が付かなかったけど最良の方法な気がします。スバラシイ!



blog comments powered by Disqus
ruby_pack8

100円〜で好評発売中!
M'ELBORNE BOOKS