1

私はプログラミングが初めてで、クラスを作成する際の「初期化」の目的を理解しようとしています。

次に例を示します。

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

Person.nameつまり、初期化とは、andPerson.petと言って直接引き出せる属性の束を作成することPerson.homeですよね? 「初期化」は、一連の変数を 1 か所に圧縮するためだけですか? これを行うと同じことを達成できますか:

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

Person.pet最初のコードとPerson.home同じ方法で値にアクセスできないでしょうか?

4

2 に答える 2

4

クラスとクラスのインスタンスの両方が実行時に実際のオブジェクトであるため、これはRubyでは(たとえばJavaとは対照的に)少し注意が必要です。そのため、クラスには独自の変数のセットがあり、そのクラスの各インスタンスも独自の変数のセットを取得します(クラスの変数とは異なります)。

あなたが言う時

class Person
  pet = nil
end

と呼ばれるクラスオブジェクトに対してのみローカルである変数petを設定していますPerson

クラスのインスタンスの変数を操作する方法は、メソッドで変数を使用することです。

class Person
  def initialize
    pet = nil
  end
end

ここで、petはの特定のインスタンスのローカル変数を指しますPerson。もちろん、このペット変数は、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.petを意味Person.homeし、エラーが発生するだけです。オブジェクト指向プログラミング (OOP) について少し読んで、さらに質問がある場合は、stackoverflow に投げることをお勧めします:D

于 2012-08-23T16:02:45.893 に答える