C#Object Initializer Syntaxと同様に、Ironrubyのプロパティを設定する方法はありますか?
質問
Ironrubyを使用して、アプリでスクリプトを行います。
私は多くのコマンド(CLRオブジェクト)を作成して実行する必要がありますが、ほとんどのコマンドはそれらに設定されたプロパティが必要であり、プロパティを設定できるようにコマンドを変数に割り当てる必要を避けたいと思います。
C#オブジェクトのようにそれを行う方法はありますか 初期化の構文?
解決
Ruby自体の機能ではないため、CLRオブジェクトを構築するときにプロパティを設定する組み込みの方法はありません。ただし、Pythonもこれをサポートしていませんが、 Ironpythonは、コンストラクターに名前付きパラメーターを提供できるようにすることでサポートしています. 。 Rubyは名前付きパラメーターをサポートしていないため、名前付きパラメーターパターンを実施したくありませんでした。 Hash
最後の議論として、または instance_eval
'd構築オブジェクト、または他の人々が思いついたものに対して。
そうは言っても、オブジェクト初期剤を実装する戦略は両方とも、Ironrubyで特別なサポートなしで純粋なRubyで書くことができます。上記の両方について説明しますが、探していた構文ではない場合は、自由に実験してください。
次のCLRクラスを仮定すると(C#で書かれています):
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
これは実際に eval
s新しく作成されたオブジェクトに対するブロックでは、ブロック内のRubyコードを実行できます。このパターンは、RubyでDSLとより自然なAPIを作成するときに人気があります。
または、Rubyの寛大さを使用することを好む場合 Hash
メソッド引数の構文:
testobj = TestObj1.new :prop1 => "Prop1 value", :prop2 => "Prop2 value"
次に、これがあなたがオーバーライドする方法です .new
方法:
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
Hash
オプションは間違いなくもう少し複雑ですが、もう少しパフォーマンスがあります(避けるので eval
)そして、Rubyのより一般的なパターンであり、指定されたパラメーターを公開します。