Ruby:为方便起见,定义一个类是“初始化”吗?

时间:2012-08-23 15:53:37

标签: ruby

我是编程的新手,正在努力找出创建课程时“初始化”的目的。

以下是一个例子:

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

初始化是通过说Person.namePerson.petPerson.home来创建一系列我可以直接提取的属性吗? “初始化”只是为了将一堆变量压缩到一个地方吗?我会做同样的事情:

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

我无法使用Person.petPerson.home以与第一个代码相同的方式访问值吗?

2 个答案:

答案 0 :(得分: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只是在首次创建实例时自动调用的方法的便捷名称。

答案 1 :(得分:3)

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

例如

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