2012-02-16 4 views
1

私は自分のアプリでいくつかのスクリプトを行うためにIronRubyを使用しています。IronRubyのプロパティをC#オブジェクト初期化子の構文と同様に設定する方法はありますか?

私は作成して実行する必要がある多くのコマンド(CLRオブジェクト)を持っていますが、コマンドの大部分はそれらに設定されたプロパティを必要とし、プロパティを設定できるようにコマンドを変数に割り当てる必要はありません。

C#オブジェクトのように行う方法はありますかinitializer syntax

答えて

3

CLRオブジェクトを構築する際に、Ruby自体の機能ではないため、プロパティを設定する組み込みの方法はありません。しかし、Pythonはこれをサポートしていませんが、IronPython does support it by allowing named parameters to be supplied to constructorsです。 Rubyは名前付きパラメータをサポートしていないので、最後の引数としてHash、または構築オブジェクトに対してブロックinstance_evalとなるような、名前付きパラメータパターンを強制したくありませんでした。

つまり、オブジェクト初期化子を実装する両方の戦略は、IronRubyの特別なサポートなしに純粋なRubyで記述することができます。上記の両方を説明しますが、探している構文とまったく同じでない場合は、自由に実験してください。

(C#で書かれた)は、次のCLRクラスを仮定:

namespace TestLib { 
    public class TestObj1 { 
    public string Prop1 { get; set; } 
    public string Prop2 { get; set; } 
    } 
} 

あなたは、コンストラクタに渡されたブロックでプロパティを初期化する想像:

testobj = TestObj1.new do 
    self.prop1 = "Prop1 Value" 
    self.prop2 = "Prop2 Value" 
end 

そして、ここでは、あなたがTestObj1.newをオーバーライドすることができる方法ですそれをサポートする方法:

class TestObj1 
    def self.new(*args, &block) 
    obj = super(*args) 
    obj.instance_eval &block 
    obj 
    end 
end 

これはctually eval新しく作成されたオブジェクトに対するブロックでは、ブロック内の任意のRubyコードを実行できます。このパターンは、RubyでDSLとより自然なAPIを作成する際に一般的です。あなたがメソッドの引数でRubyの寛大Hashの構文を使用して希望する場合

または、:Hashオプションは間違いビットです

class TestObj1 
    def self.new(*args) 
    last_arg = args[-1] 
    if last_arg.kind_of?(Hash) 
     first_args = args[0..-2] 
     obj = super(*first_args) 
     last_arg.each do |prop, val| 
     obj.send("#{prop}=", val) 
     end 
     return obj 
    end 
    super(*args) 
    end 
end 

testobj = TestObj1.new :prop1 => "Prop1 value", :prop2 => "Prop2 value" 

は、これはあなたが.newメソッドをオーバーライドすることができる方法でありますもっと複雑ですが、よりパフォーマンスが良く(evalを避けるため)、名前付きパラメータを公開するためにRubyのより一般的なパターンです。

関連する問題