2006-02-17
■[ruby][rails] フィルタ (2)
長い道のりだった……、id:babie:20050921:p7 の続き。って9月かよ!
PHP の Smarty や Perl の TT のように 「|」 でフィルタチェインができたらええなー、と考えてたやつ。
カリー化を使ったお! 使えるお! もっと簡単な実現方法があっても気にしない。カリー化使えて満足。
#!/usr/bin/ruby
# this method was written by HORIKAWA Hisashi.
# See: http://www.nslabs.jp/ramble-200601.rhtml#28
def currying(name, *args)
if name.kind_of?(Proc) or name.kind_of?(Method)
m = name
else
m = method(name)
end
arity = m.arity >= 0 ? m.arity : -m.arity - 1
if arity <= args.size
m.call(*args)
else
lambda {|*a| currying(name, *(args + a))}
end
end
# below code written by babie.
class String
def | m
m.call(self)
end
end
class Filter
def sigh str
"..." + str + "..."
end
def sandwich(bread, str)
bread + str + bread
end
def headtail(prefix, suffix, str)
prefix + str + suffix
end
end
if __FILE__ == $0
# curry
curry_sandwich = currying(Filter.new.method(:sandwich), "---")
p "ahaha" | curry_sandwich
# def
def def_sandwich(*arg)
currying(Filter.new.method(:sandwich), *arg)
end
p "ihihi" | def_sandwich("---")
# eval
eval <<-EVAL
def eval_sandwich(*arg)
currying(Filter.new.method(:sandwich), *arg)
end
EVAL
p "ufufu" | eval_sandwich("---")
# final
class Dummy; end
(Filter.instance_methods - Dummy.instance_methods).each do |name|
eval <<-EVAL
def #{name}(*arg)
currying(Filter.new.method(:#{name}), *arg)
end
EVAL
end
p "fufuf" | sigh
p "ehehe" | sandwich("---")
p "ohoho" | headtail("<<<", ">>>")
end
出力:
$ ruby filter.rb "---ahaha---" "---ihihi---" "---ufufu---" "...fufuf..." "---ehehe---" "<<<ohoho>>>"
ここまでくれば Rails に載せるのも、そう遠くはあるめぇ。
トラックバック - http://d.hatena.ne.jp/babie/20060217/p4
リンク元
- 104 http://idm.s9.xrea.com/ratio/2006/11/14/000541.html
- 34 http://yugui.jp/articles/541
- 31 http://www.rubyist.net/~kazu/samidare/
- 16 http://feedbringer.net/feed
- 12 http://www.google.co.jp/search?q=シェア P2P&hl=ja&lr=&rls=GGLD,GGLD:2005-20,GGLD:ja&start=10&sa=N
- 11 http://d.hatena.ne.jp/keyworddiary/Ruby
- 11 http://log.ttsky.net/article/18938568.html
- 10 http://ruby-metaprogramming.rubylearning.com/yugui_blog_translation_1.html
- 9 http://www.google.co.jp/search?sourceid=navclient&hl=ja&ie=UTF-8&rls=GGLG,GGLG:2005-52,GGLG:ja&q=シェア P2P
- 6 http://d.hatena.ne.jp/keyword/HISASHI

