2016-07-23 4 views
0

メソッドを使用して、Objectにクラスを定数として定義できます。誰かが引数をClass.newブロックに渡す、面白い、または有益なユースケースはありますか?Class.newブロックの引数

Object.const_set(:Klass, Class.new do |can_i_use_this| 
    def ping 
    "pong" 
    end 
end) 

Klass.new.ping 

これで何かできますか?

答えて

2

ブロック引数は、作成するクラスであることが判明しました。 IRB

Class.new do |what| 
    p what 
end 

にこのスニペットを実行すると、あなたは、出力の最初の行がp whatによって与えられ、2行目は、我々が知っているClass.newの戻り値を示している

#<Class:0x000000022b2698> 
=> #<Class:0x000000022b2698> 

のようなものが表示されますクラス。 whatは戻り値Class.newと同じオブジェクトであることがわかります。

結論:block引数は、そのクラスでselfだけを使用してクラスインスタンスを取得できるため、あまり有用ではありません。私が想像することができる唯一の用法は、フラットスコープというトリックを使用してメソッドを作成することです。

Foo = Class.new do |klass| 
    define_method :class_name do 
    klass.name 
    end 
end 

Foo.new.class_name #=> "Foo" 

しかし、オブジェクトがself.classとそのクラスを簡単にアクセスすることができますので、これはどちらかの非常に有用ではありません。

+1

今日新しいことを学んだ!私は['Class :: new'がブロックをクラスにもたらすことは知らなかった](http://ruby-doc.org/core/Class.html#method-c-new)! –

関連する問題