ruby - 如何访问传递给另一个类的构造函数的类实例的属性
问题描述
来自 .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
,它们属于两个不同的实例。
一个属于FooClass
。这个被初始化为3
. 另一个属于foo_class
. 这个永远不会分配给,因此它是未初始化的,因此评估为nil
。
如果你希望它有一个特定的值,你需要实际分配一个:你定义了一个属性编写器方法,但你从不调用它:
foo_class.number = 4
现在,实例变量@number
被foo_class
初始化为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
现在,可以保证@number
任何实例的实例变量FooClass
总是被初始化为4
(至少在用户使用默认Class#new
工厂方法时)。
推荐阅读
- python - 镜像一个 numpy ndarray
- graphql - Amplify GraphQL - 允许所有者访问某些行,每个人都可以访问某些行
- java - 使用 jaxb 依赖项时如何修复 ClassCastException
- ios - 深不可测的行为:UIViewController 的 viewWillLayoutSubviews()
- java - 带有占位符引用的平面缓冲区
- azure - 在 Azure 中休息 API 服务
- sql-server - SQL Group by 返回一行
- git-bash - 尝试安装 jhbuild 时出现问题(对于 PyGObject)
- firebase - Firebase 实时数据库 Rest API 引用对象
- javascript - OpenStreet 地图未正确渲染