From: Takeshi Iogawa Date: 2014-04-17T19:37:29+09:00 Subject: [ruby-list:49795] Re: lambdaとかprocとか使ったプログラム いおがわと申します。こんにちは。 具体例と言うほどのシロモノではないですが、現在作成中の趣味プログラムに ちょうど、勉強がてら組み込んでいたので投稿してみます。 Ruby に下記(1) のようなHTML を吐き出させようとしています。 ちなみに(2) の出力でよければ簡単なメソッド一つでことが足りますが、 (1) のように配置したいのです。 蛇足ですが、bar(); はHTML Header 内にハードコーディングされた JavaScript で、Web ページでよくあるブロック要素の表示・非表示を クライアント側で切り替える簡単なもの(0) です。 -- (1)
content_a
content_b
(2)
content_a
content_b
(0) -- この(1) を実現するために下記(a) のサンプルコードを書いてみました。 これで配列の定数CONTENTS_LIST を編集するだけで、いくらでもコンテンツを 増減できます。 このくらい短いと(b) のように書いてしまったほうが単純と思いますが。 肝は、同一性の管理・保証を外部でやらないといけないかどうか、かと思って います。 このサンプルではコンテンツは定数で固定されていますが、もしコンテンツが 動的に変化するのであればありがたみが出てくるんだと理解しています。 どうでしょうか? # 素直にクラス定義しちゃえよ、って話なのかもしれない (a) #! /usr/bin/ruby # -*- coding: utf-8 -*- CONTENTS_LIST = [ {:tag_id => 'tag_a', :button => 'button_a', :content => 'content_a'}, {:tag_id => 'tag_b', :button => 'button_b', :content => 'content_b'} ] def keep_binding tag_id, button_name, content t, b, c = tag_id, button_name, content put_content = lambda { %(
#{c}
\n) } put_button = lambda { %(\n) } {:button => put_button, :content => put_content} end button_and_content_pairs = [] CONTENTS_LIST.each { |h| button_and_content_pairs << keep_binding(h[:tag_id], h[:button], h[:content]) } button_and_content_pairs.each{ |h| print h[:button ].call} button_and_content_pairs.each{ |h| print h[:content].call} __END__ (b) CONTENTS_LIST = 同上 def put_button h %(\n) end def put_content; (省略); end CONTENTS_LIST.each { |h| put_button h} CONTENTS_LIST.each { |h| put_content h} __END__ -- 以上、こちらも修行中でつたないコードで、お目汚し失礼いたしました。 (2014/04/11 16:19), 牛坂 博則 wrote: > みなさんありがとうございました。 > > やはりコードを繰り返し使う時そのコードを保存できるという使い方が一般的み > たいですね。あまりにもややっこしいので何か特別な使い方があるのか と勘 > ぐってしまいました。 > > うまくまとまっていると思われるurlを見つけましたので載せておきます。 > http://d.hatena.ne.jp/shunsuk/20090101/1230816826 > http://www.reactive.io/tips/2008/12/21/understanding-ruby-blocks-procs-and-lambdas/ > -- Takeshi Iogawa