私は自分のアプリでいくつかのスクリプトを行うためにIronRubyを使用しています。IronRubyのプロパティをC#オブジェクト初期化子の構文と同様に設定する方法はありますか?
私は作成して実行する必要がある多くのコマンド(CLRオブジェクト)を持っていますが、コマンドの大部分はそれらに設定されたプロパティを必要とし、プロパティを設定できるようにコマンドを変数に割り当てる必要はありません。
C#オブジェクトのように行う方法はありますかinitializer syntax?
私は自分のアプリでいくつかのスクリプトを行うためにIronRubyを使用しています。IronRubyのプロパティをC#オブジェクト初期化子の構文と同様に設定する方法はありますか?
私は作成して実行する必要がある多くのコマンド(CLRオブジェクト)を持っていますが、コマンドの大部分はそれらに設定されたプロパティを必要とし、プロパティを設定できるようにコマンドを変数に割り当てる必要はありません。
C#オブジェクトのように行う方法はありますかinitializer syntax?
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のより一般的なパターンです。