[#49804] Re: 小数点以下の表示で質問があります。 — Fumiaki Sakamoto <ght8270407fs@...>

自己レスですみません。

14 messages 2014/04/23
[#49805] Re: 小数点以下の表示で質問があります。 — "KISHIMOTO, Makoto" <ksmakoto@...4u.or.jp> 2014/04/23

きしもとです

[#49806] Re: 小数点以下の表示で質問があります。 — Fumiaki Sakamoto <ght8270407fs@...> 2014/04/23

きしもとさま

[#49808] Re: 小数点以下の表示で質問があります。 — Tetsuo Sakaguchi <saka@...> 2014/04/23

阪口です。

[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

In This Thread

Prev Next