0

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

class Something
    def initialize
        @x=101
    end

    def getX
        return @x
    end
 end

obj = Something.new
puts obj.getX
=>101

Something.new 将创建带有实例变量@x 的Something 类的新实例,该变量对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 时将创建(如构造函数)新的 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

4

2 回答 2

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以向我们提供一种设置默认值的简单方法(以及其他方法)。

于 2013-10-22T18:50:19.273 回答
1

从技术上讲,是的。但是考虑一下面向对象编程的概念——以类和对象的形式创建现实世界的抽象。

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

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

很少有学生也在学校学习;所以他们自然会获得一些成绩和东西;要实例化有关学生的这些详细信息,您需要这样做:

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

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

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

于 2013-10-22T18:35:33.013 回答