如何访问传递给另一个类构造函数的类实例的属性



来自。net世界,并迈出了我学习Ruby的第一步。这应该是非常直接的,但我仍然错过了一些东西:

class TestClass
def initialize(foo_class)
puts foo_class.number
end
end

class FooClass
@number = 3
attr_accessor :number
end
foo_class = FooClass.new
test_class = TestClass.new(foo_class)

我希望数字3出现在输出中,但它是空的。但是我已经定义了@number只有一个@以确保它是一个实例变量,因此它应该附加到我传递给TestClass构造函数的实例上。我错过了什么?

实例变量属于实例。这就是为什么它们被称为实例变量。这里有两个实例变量,它们都称为@number,它们属于两个不同的实例。

1属于FooClass。这个初始化为3。另一个属于foo_class。这个值从来没有被赋值,因此它是未初始化的,因此计算结果为nil

如果你想让它有一个特定的值,你需要给它赋一个值:你定义了一个属性写入器方法,但你从不调用它:

foo_class.number = 4

现在,foo_class的实例变量@number被初始化为4

如果你不想强迫用户记住自己初始化实例变量,你可以使用初始化方法。注意,初始化方法都没什么特别的,他们的方法就像任何其他方法。

然而,大多数对象都是通过调用Class#new工厂方法创建的,它看起来像这样:
class Class
def new(...)
obj = allocate
obj.initialize(...)
obj
end
end
如您所见,Class#new的默认实现在新创建的实例上调用一个名为initialize的实例方法,这意味着您可以通过覆盖#initialize来定制初始化:
class FooClass
@number = 3
attr_accessor :number
def initialize
self.number = 4
end
end

现在,可以保证FooClass的任何实例的实例变量@number将始终初始化为4(至少当用户使用默认的Class#new工厂方法时)。

相关内容

  • 没有找到相关文章

最新更新