Kagemushaを使って、スコープを汚さないDSLスタイルのinitialize
メソッドを提供する方法を紹介します。

ruby>>
require 'rubygems'
require 'kagemusha'

class Foo
def initialize(&block)
bar = nil # default value
meta = eval('class << self; self end', block.binding)
Kagemusha.new(meta) do |kage|
kage.def(:bar){|bar|} # substitution
end.swap(&block)
@bar = bar
end
end

def bar(x); puts x end

foo = Foo.new do
bar 'bar'
end

puts foo.inspect # => #<Foo:0xb7c03de0 @bar="bar">
bar "hello!" # => hello!
<<--

bindingのコンテクストからメタクラスを取得し、
Kagemushaを使って限定的にbarメソッドを置き換えています。
Foo.newのブロック内から抜けると、
barの呼び出しはグローバルスコープのbarを呼んで、
"hello!"が出力されます。

この方法は、initialize以外にも、
ブロックを受けるインスタンスメソッド全般に利用できます。
例えば、以下のようなコードで、一時変数t
の存在が気になる場合などですね。

rails>>
create_table do |t|
t.string :foo
end
<<--

posted by genki genki on Thu 17 Jul 2008 at 18:41 with 1 comment
瀧内元気 瀧内元気 07/17 19:52
**別解**

ruby>>
class Foo
def initialize(&block)
bar = nil
instance_eval(&block)
end

private
def bar(x) @bar = x end
end

def bar(x); puts x end

foo = Foo.new do
bar 'bar'
end
<<--

こっちの方がシンプルに記述できますが、
`new`ブロック内で、隠蔽されていた無関係のプライベートメソッドが不用意に呼ばれてしまう可能性があるので、ちょっと微妙な感じですね。
Contents rssrss
光ファイバーを二次元振動させて走査するAR用ディスプレイ
因果の取り違え
Swift2's defer for CoffeeScript
mongodb-3.0からcreateIndexのdropDupsが無くなったらしい
mongodb-3.0以降のWiredTigerの設定を動的に変更する方法
一般楕円の高速生成アルゴリズムへの道標
farro mantecatoのレシピ
Droonga関連の記事のまとめ
RuntimeErrorの特定のメッセージに限定してrescueする方法
jQueryでscriptタグを実行せずにappendする
Tags
coffeescriptdefergroongajsmemonodenodejs
Comments rssrss
https://xn--krken21-bn4c.com https://xn--krken21-bn4c.com: Как отличить настоящий маркетплейс от подделки Kra... 05/01 12:20
https://example.com/xkkpsk https://example.com/xkkpsk: Great blog you have here.. It's difficult to find ... 05/01 09:31
https://onlinemo.ir https://onlinemo.ir: جمع‌بندی برای اون گروه از کاربرا که سیستم‌ها... 05/01 00:58
https://xn--mgmarkt9-9db.com https://xn--mgmarkt9-9db.com: Как обезопасить MEGA: настройка менеджера паролей ... 04/30 20:14
https://qeshmtourist.ir https://qeshmtourist.ir: در کل قضیه برای اونایی که می‌خوان وارد بشن س... 04/30 19:31
https://negarinadv.ir https://negarinadv.ir: سلام و عرض ادب، بنده مدتی قبل هنگام گشتن تو اینت... 04/30 18:56
https://gsmcharge.ir https://gsmcharge.ir: در کل قضیه برای کاربران علاقه‌مند به پلتفرم‌... 04/30 13:51
https://azardl.ir https://azardl.ir: در کل برای کاربرایی که در جستجو هستن پلتفرم‌... 04/30 02:42