.net 在IronRuby中有没有类似于C#对象初始值设定项语法的设置属性的方法?

.net 在IronRuby中有没有类似于C#对象初始值设定项语法的设置属性的方法?,.net,ruby,ironruby,.net,Ruby,Ironruby,我正在使用IronRuby在我的应用程序中编写脚本 我需要创建和执行很多命令(CLR对象),但大多数命令都需要在其上设置属性,我希望避免将命令分配给变量,以便设置属性 有没有一种方法可以像C#object那样实现呢?在构建CLR对象时,没有内置的设置属性的方法,因为它不是Ruby本身的特性。然而,尽管Python也不支持这一点。由于Ruby不支持命名参数,所以我们不希望强制使用命名参数模式,无论是作为最后一个参数的散列,还是针对构造对象的实例_eval'd块,或者其他人们想到的东西 也就是说,实

我正在使用IronRuby在我的应用程序中编写脚本

我需要创建和执行很多命令(CLR对象),但大多数命令都需要在其上设置属性,我希望避免将命令分配给变量,以便设置属性


有没有一种方法可以像C#object那样实现呢?

在构建CLR对象时,没有内置的设置属性的方法,因为它不是Ruby本身的特性。然而,尽管Python也不支持这一点。由于Ruby不支持命名参数,所以我们不希望强制使用命名参数模式,无论是作为最后一个参数的
散列
,还是针对构造对象的
实例_eval
'd块,或者其他人们想到的东西

也就是说,实现对象初始值设定项的两种策略都可以用纯Ruby编写,而不需要IronRuby中的任何特殊支持。我将描述上面列出的两种语法,但如果它们与您所寻找的语法不完全相同,请随意尝试

假设以下CLR类(用C#编写):

您可以想象使用传递给构造函数的块初始化属性:

testobj = TestObj1.new do
  self.prop1 = "Prop1 Value"
  self.prop2 = "Prop2 Value"
end
下面是如何覆盖TestObj1的方法。新的方法可以支持这一点:

class TestObj1
  def self.new(*args, &block)
    obj = super(*args)
    obj.instance_eval &block
    obj
  end
end
由于这实际上是对新创建的对象执行块的
eval
s,因此可以在块内执行任何Ruby代码。在Ruby中创建DSL和更自然的API时,这种模式很流行

或者,如果您喜欢在方法参数中使用Ruby的宽松的
散列
语法:

testobj = TestObj1.new :prop1 => "Prop1 value", :prop2 => "Prop2 value"
然后,这就是如何覆盖
。新的
方法:

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中更常见的公开命名参数的模式

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