实例变量通过方法

在以下示例中,对我来说一切都是合乎逻辑的

class Something def initialize @x=101 end def getX return @x end end obj = Something.new puts obj.getX =>101 

Something.new将创建具有实例变量@x的类的新实例,它将对类Something的所有方法可见。

但是如果没有initialize(构造函数)方法,第二个例子会发生什么。

 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 

因此,如果我正确地做到了这一点,那么每个类的方法都可以创建新的实例变量,它可用于所有类的方法? 然后每个方法都可以反复覆盖该实例变量(循环)?

我是ruby的新手,所以也许在这里我犯了大错,或者不理解一些基本概念,所以不要大叫:D

从技术上讲,是的。 但要考虑面向对象编程的概念 – 以类和对象的forms创建真实世界的抽象。

例如,如果你在谈论学校的学生 ; 你知道这是一个可抽象的实体。 因此,您继续将学生的共同特征包含在class级学生中

initialize是一个构造函数。 当您在系统中创建新学生时,您自然希望提供关于他的一些必要细节,例如他的姓名年龄class级 。 所以在initialize方法中你设置那些实例变量

很少有学生也在学校学习; 所以他们自然会获得一些等级和东西; 为了实例化关于学生的那些细节,你会想要用这样的东西来做:

 #Student(name, age, class) kiddorails = Student.new("Kiddorails", 7, 2) #to grade: kiddorails.set_grades #do stuff 

因此,您可以在对象中变异和设置实例变量,几乎可以在类中的任何位置; 但重点是 – 做它,有意义的地方

PS:如果需要,您应该始终将默认值设置为未通过initialize initialize设置的实例变量。

当对象存在时,可以命名和操作对象的实例变量。 当我们使用irb提示对象时,请参阅下面的示例:

 $ irb > instance_variables # => [:@prompt] > @foo # => nil > instance_variables # => [:@prompt] > @foo = 1 # => 1 > instance_variables # => [:@prompt, :@foo] > @foo # => 1 

现在,这里是来自文档的Class#new的描述:

调用allocate来创建类的类的新对象,然后调用该对象的initialize方法 ,并将其传递给args。 这是每当使用.new构造对象时最终被调用的方法。

想到这一点的一种方法是initialize在function上是一个常规方法,就像你的其他实例方法一样,只有它被Class#new调用才能为我们提供一种设置默认值的简单方法(以及其他方法)。