C#Object Initializer Syntaxと同様に、Ironrubyのプロパティを設定する方法はありますか?

StackOverflow https://stackoverflow.com/questions/9304459

  •  25-10-2019
  •  | 
  •  

質問

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

これは実際に evals新しく作成されたオブジェクトに対するブロックでは、ブロック内の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のより一般的なパターンであり、指定されたパラメーターを公開します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top