在下面的例子中,对我来说一切都是合乎逻辑的:
class Something
def initialize
@x=101
end
def getX
return @x
end
end
obj = Something.new
puts obj.getX
=>101
Something.new将使用实例变量@x创建类的新实例,这对于Something类的所有方法都是可见的。
但是如果没有初始化(构造函数)方法,第二个例子会发生什么。
class Something
def bla_bla_method
@x=101
end
def getX
return @x
end
end
obj = Something.new
puts obj.getX
=>nil
obj.bla_bla_method
puts obj.getX
=>101
所以现在调用bla_bla_method会创建(比如构造函数)new instance_variable @x并将该实例变量添加到“实例变量表”中,这对所有方法都可以再次使用吗?
所以现在如果我在类Something中添加新方法“new_method”(在第二个例子中):
def new_method
@x=201
end
...
obj.bla_bla_method
puts obj.getX
=>101
obj.new_method
puts obj.getX
=>201
因此,如果我正确的话,每个类的方法都可以创建新的实例变量,它可用于所有类的方法?然后每个方法都可以反复覆盖该实例变量(循环)?
我是红宝石的新手所以也许在这里我犯了大错或者不理解一些基本概念,所以不要大喊:D
答案 0 :(得分:2)
当对象存在时,可以命名和操作对象的实例变量。当我们使用irb提示对象时,请参阅下面的示例:
$ irb
> instance_variables # => [:@prompt]
> @foo # => nil
> instance_variables # => [:@prompt]
> @foo = 1 # => 1
> instance_variables # => [:@prompt, :@foo]
> @foo # => 1
现在,这里是文档中Class#new
的说明:
调用 allocate来创建类的新对象,然后调用该对象的初始化方法,并将其传递给args。这是在使用.new。
构造对象时最终调用的方法
考虑到这一点的一种方法是initialize
在函数上是一个常规方法,就像你的其他实例方法一样,只有它被Class#new
调用才能为我们提供一种设置默认值的简单方法(除其他外)。
答案 1 :(得分:1)
技术上,是的。但要考虑面向对象编程的概念 - 以类和对象的形式创建真实世界的抽象。
例如,如果您在学校谈论学生;你知道这是一个可抽象的实体。因此,您继续将学生的共同特征包含在班级学生中。
initialize
是一个构造函数。当您在系统中创建新学生时,您自然希望提供关于他的一些必要详细信息,例如他的名称,年龄和类。
因此,在initialize
方法中,您可以设置实例变量。
很少有学生也在学校学习;所以他们自然会获得一些等级和东西;为了实例化关于学生的这些细节,你可能希望用这样的东西来做:
#Student(name, age, class)
kiddorails = Student.new("Kiddorails", 7, 2)
#to grade:
kiddorails.set_grades
#do stuff
因此,您可以在对象中变异和设置实例变量,几乎可以在类中的任何位置;但重点是 - 这样做,哪里有意义。
PS:如果需要,您应该始终将默认值设置为initialize
中未通过initialize
设置的实例变量。