如何访问传递给另一个 class 的构造函数的 class 实例的 属性
How to access property of class instance passed to the constructor of another class
来自 .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
现在,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
工厂方法)。
来自 .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
现在,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
工厂方法)。