JavaScript、Ajax、HTML5(API)、Ruby…Web及び関連技術の実験&情報公開&制作物紹介。

Rubyでちょっと込み入った変数の初期化

| コメント(0) | トラックバック(0)

JavaScriptだと、1つの変数にちょっと込み入った処理の結果を初期値として定義するとき、わざわざ他のローカル変数や別の関数を導入してスコープを汚したくないときとかに↓

var a = function (x, y) {  
    :(x、yを利用した複雑な処理)  
    return XXX;  // こんな形で最終処理結果を返す  
}(b, c);

みたいに、無名関数(JavaScriptの世界ではこれをクロージャと呼ぶこともある)を定義してその場で実行する、ってよくあります(あると思います)(ありますよね?)。

Rubyで同じようなこと出来ないかな? と思ったときに、こうすれば出来るじゃん、っていう方法を見つけたのですが↓、

a = proc {|x, y|  
   :(x、yを利用した複雑な処理)  
  XXX  # こんな形で最終処理結果を返す  
}.call(b, c)

これって一般的? よく使われる方法? あとこう言った場合に、もっとスマートな方法って何かあるでしょうか?

教えて、えらい人(or Ruby識者)。

【2010/05/06 追記】

その後、自分なりにいろいろ調べてみた。
大体あってたけれど、↓こっちの書き方の方が互換性とか考えると良さげ。

a = lambda {|x, y|  
   :(x、yを利用した複雑な処理)  
  XXX  # こんな形で最終処理結果を返す  
}.call(b, c)

「lambda」と「proc」は、ここでの使い方ではRuby1.8.xなら全く同じ意味で、Ruby1.9.xだと少し違うらしい。

  • lambda
    ...ブロック内で return するとそのブロックを抜ける
  • proc
    ...ブロック内で return するとそのブロックを実行している関数を抜ける

ということらしい。

あとコンパクトと言う意味では、「Proc#call」の代わりに「Proc#[]」の書き方ができる。

a = lambda {|x, y|  
   :(x、yを利用した複雑な処理)  
  XXX  # こんな形で最終処理結果を返す  
}[b, c]

さらにRuby1.9.xなら、「.call()」を「.()」と省略して書ける。
↑の例より1文字(1バイト)多いけれど、より「呼び出してる」感が出て直感的。

a = lambda {|x, y|  
   :(x、yを利用した複雑な処理)  
  XXX  # こんな形で最終処理結果を返す  
}.(b, c)

トラックバック(0)

トラックバックURL: http://www.antimon2.atnifty.com/mt5/mt-tb.cgi/71

コメントする

カテゴリ

月別 アーカイブ

OpenID対応しています OpenIDについて

このブログ記事について

このページは、あんちもん2が2010年5月 4日 17:53に書いたブログ記事です。

ひとつ前のブログ記事は「Twitter Bot の紹介」です。

次のブログ記事は「動的にCSSを追加 append_css.js」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。