1

我是编程新手,并试图弄清楚创建类时“初始化”的目的。

这是一个例子:

class Person
  def initialize(name)
    @name = name
    @pet = nil
    @home = 'NYC'
  end
end

所以初始化就是创建一堆属性,我可以直接用Person.nameandPerson.pet和and来提取,Person.home对吧?“初始化”只是为了将一堆变量压缩到一个地方吗?我会做同样的事情吗:

class Person     
  pet = nil    
  home = 'NYC'    
  #not so sure how to replicate the @name here.    
end

我不能像在第一个代码中那样访问这些值Person.petPerson.home

4

2 回答 2

4

这在 Ruby(与 Java 相对)中有点棘手,因为类和类的实例都是运行时的实际对象。因此,一个类有自己的一组变量,并且该类的每个实例也有自己的一组变量(与类的变量不同)。

当你说

class Person
  pet = nil
end

您正在设置一个变量 pet,它仅对名为 的类对象是本地的Person

操作类实例变量的方法是在方法中使用变量:

class Person
  def initialize
    pet = nil
  end
end

在这里,pet 指的是给定实例的局部变量Person。当然,这个 pet 变量在定义时是非常无用的,因为它只是一个在initialize函数完成后会消失的局部变量。使该变量在实例的生命周期内保持不变的方法是将其设为实例变量,您可以通过在其前面加上@. 因此我们到达了您的第一个初始化:

class Person
  def initialize
    @pet = nil
    # And so on
  end
end

所以,至于你为什么需要initialize. 由于设置实例的实例变量的唯一方法Person是在 的方法中Person,因此这种初始化需要在某些方法中。 initialize只是第一次创建实例时自动调用的方法的方便名称。

于 2012-08-23T16:18:28.237 回答
3

Initialize 是一种通常称为对象构造函数的方法。它在您调用时使用Person.new("Bob"),它将为您提供该Person对象的实例。您在初始化中的变量之前看到的 @ 符号使变量成为实例变量,这意味着只有在您拥有该对象的实例后才能访问该变量,并且它将在该实例的整个生命周期内一直存在。

例如

person = Person.new("Bob")
person.name #Will output Bob
person.home #Will output NYC

类是对象,这样做:

class Person
  pet = nil
  home = 'NYC'
end

只是创建局部变量 pet 和 home 并且将超出类的范围。这意味着打电话Person.petPerson.home只会给你一个错误。我建议对面向对象编程(OOP)做一点阅读,如果您还有任何问题,请将它们扔到 stackoverflow 中:D

于 2012-08-23T16:02:45.893 回答