首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在Ruby中初始化对象时设置属性值?

如何在Ruby中初始化对象时设置属性值?
EN

Stack Overflow用户
提问于 2010-02-28 03:23:53
回答 6查看 13.1K关注 0票数 19

给定以下类:

代码语言:javascript
复制
class Test
  attr_accessor :name
end

创建对象时,我希望执行以下操作:

代码语言:javascript
复制
t = Test.new {name = 'Some Test Object'}

目前,它导致name属性仍然是nil

在不添加初始化器的情况下可以实现吗?

EN

回答 6

Stack Overflow用户

发布于 2010-02-28 04:26:51

正如其他人所提到的,最简单的方法是定义一个initialize方法。如果你不想这样做,你可以让你的类继承Struct

代码语言:javascript
复制
class Test < Struct.new(:name)
end

所以现在:

代码语言:javascript
复制
>> t = Test.new("Some Test Object")
=> #<struct Test name="Some Test Object">
>> t.name
=> "Some Test Object"
票数 9
EN

Stack Overflow用户

发布于 2010-03-01 14:36:37

有一种通过传递带有必要操作的块来执行复杂对象初始化的通用方法。这个块是在要初始化的对象的上下文中计算的,因此您可以轻松地访问所有实例变量和方法。

继续你的例子,我们可以定义这个泛型初始化器:

代码语言:javascript
复制
class Test
  attr_accessor :name

  def initialize(&block)
    instance_eval(&block)
  end 
end

然后将相应的代码块传递给它:

代码语言:javascript
复制
t = Test.new { @name = 'name' }

代码语言:javascript
复制
t = Test.new do
  self.name = 'name'
  # Any other initialization code, if needed.
end

请注意,这种方法本身并不需要向initialize方法添加太多复杂性。

票数 8
EN

Stack Overflow用户

发布于 2010-02-28 03:30:56

您指定的代码正在将参数传递给initialize函数。你必须要么使用initialize,要么使用更无聊的语法:

代码语言:javascript
复制
test = Test.new
test.name = 'Some test object'
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2348621

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档