给定以下类:
class Test
attr_accessor :name
end
创建对象时,我希望执行以下操作:
t = Test.new {name = 'Some Test Object'}
目前,它导致name
属性仍然是nil
。
在不添加初始化器的情况下可以实现吗?
发布于 2010-02-28 04:26:51
正如其他人所提到的,最简单的方法是定义一个initialize
方法。如果你不想这样做,你可以让你的类继承Struct。
class Test < Struct.new(:name)
end
所以现在:
>> t = Test.new("Some Test Object")
=> #<struct Test name="Some Test Object">
>> t.name
=> "Some Test Object"
发布于 2010-03-01 14:36:37
有一种通过传递带有必要操作的块来执行复杂对象初始化的通用方法。这个块是在要初始化的对象的上下文中计算的,因此您可以轻松地访问所有实例变量和方法。
继续你的例子,我们可以定义这个泛型初始化器:
class Test
attr_accessor :name
def initialize(&block)
instance_eval(&block)
end
end
然后将相应的代码块传递给它:
t = Test.new { @name = 'name' }
或
t = Test.new do
self.name = 'name'
# Any other initialization code, if needed.
end
请注意,这种方法本身并不需要向initialize
方法添加太多复杂性。
发布于 2010-02-28 03:30:56
您指定的代码正在将参数传递给initialize
函数。你必须要么使用initialize
,要么使用更无聊的语法:
test = Test.new
test.name = 'Some test object'
https://stackoverflow.com/questions/2348621
复制相似问题