[ruby-list:49795] Re: lambdaとかprocとか使ったプログラム
From:
Takeshi Iogawa <alpha@246.ne.jp>
Date:
2014-04-17 10:37:29 UTC
List:
ruby-list #49795
いおがわと申します。こんにちは。
具体例と言うほどのシロモノではないですが、現在作成中の趣味プログラムに
ちょうど、勉強がてら組み込んでいたので投稿してみます。
Ruby に下記(1) のようなHTML を吐き出させようとしています。
ちなみに(2) の出力でよければ簡単なメソッド一つでことが足りますが、
(1) のように配置したいのです。
蛇足ですが、bar(); はHTML Header 内にハードコーディングされた
JavaScript で、Web ページでよくあるブロック要素の表示・非表示を
クライアント側で切り替える簡単なもの(0) です。
--
(1)
<input type="button" name="button_a" onClick="bar('tag_a');">
<input type="button" name="button_b" onClick="bar('tag_b');">
<div id="tag_a">content_a</div>
<div id="tag_b">content_b</div>
(2)
<input type="button" name="button_a" onClick="bar('tag_a');">
<div id="tag_a">content_a</div>
<input type="button" name="button_b" onClick="bar('tag_b');">
<div id="tag_b">content_b</div>
(0)
<script language="javascript" type="text/javascript">
function bar(id){
var obj = getElementById(id);
obj && (
obj.style.display =
(obj.style.display == "none") ? "block" : "none");
}
</script>
--
この(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 {
%(<div id="#{t}">#{c}</div>\n)
}
put_button = lambda {
%(<input type="button" name="#{b}" onClick="bar('#{t}');">\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
%(<input type="button" name="#{h[:button}"
onClick="bar('#{h[:tag_id]}');">\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