给定以下类:

class Test
  attr_accessor :name
end

创建对象时,我要执行以下操作:
t = Test.new {Name = 'Some Test Object'}

目前,它的结果是名称仍然是nil。这可能吗?
注意:我不想添加初始值设定项。

最佳答案

好啊,
我想出了一个解决办法。它使用initialize方法,但在另一方面却做了您想要的事情。

class Test
  attr_accessor :name

  def initialize(init)
    init.each_pair do |key, val|
      instance_variable_set('@' + key.to_s, val)
    end
  end

  def display
    puts @name
  end

end

t = Test.new :name => 'hello'
t.display

高兴吗?:)
使用继承的替代解决方案。注意,使用这个解决方案,您不需要显式声明attr_访问器!
class CSharpStyle
  def initialize(init)
    init.each_pair do |key, val|
      instance_variable_set('@' + key.to_s, val)
      instance_eval "class << self; attr_accessor :#{key.to_s}; end"
    end
  end
end

class Test < CSharpStyle
  def initialize(arg1, arg2, *init)
    super(init.last)
  end
end

t = Test.new 'a val 1', 'a val 2', {:left => 'gauche', :right => 'droite'}
puts "#{t.left} <=> #{t.right}"

关于ruby - Ruby-初始化对象时设置属性值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2348621/

10-09 15:53