Ich bin ein bisschen verwirrt über die Initialisierungsmethode. Ich verstehe, dass es automatisch aufgerufen wird, wenn Sie Person.new ausführen und die Argumente wie Person.new("james") hinzufügen. Was ich nicht verstehe ist, warum sollten Sie Instanzvariablen in Ihrer Initialisierungsmethode haben, die auch nicht als Argument verwendet werden. Ist es so, dass Sie sie später verwenden können, nachdem die Instanz erstellt wurde? Siehe unten. Welchen Grund gibt es, @age in der Initialisierungsmethode zu haben, aber nicht als Argument. Vielen Dank.

class Person

  attr_accessor :name, :age

  def initialize(name)
    @name = name
    @age = age
  end
0
b.herring 18 Jän. 2019 im 21:33

3 Antworten

Beste Antwort

Sie können eine Instanzvariable in jeder Methode Ihrer Klasse festlegen.

initialize ist eine Methode, die unmittelbar nach dem Aufruf von Person.new ausgeführt wird.

Alle externen Daten für das neue Objekt werden über die Argumente von .new(args) übergeben.

Ihre Zeile @age = age - es ist dieselbe wie @age = nil.

Dies liegt an der Tatsache, dass age in den Argumenten von initialize fehlt.

Sie haben auch attr_accessor :age.

Es ist gleich, dass Sie Methoden haben:

def age
  @age
end

def age=(age)
  @age = age
end

Sie können also eine Instanzvariable wie folgt festlegen:

john = Person.new('John')
p john.age #=> nil

john.age = 5
p john.age #=> 5
0
mechnicov 18 Jän. 2019 im 20:04

Die in Ihrer Initialisierungsmethode deklarierten Instanzvariablen müssen nur diejenigen sein, die Sie während der Initialisierung festlegen möchten. In Ihrem Person Klassenbeispiel müssten Sie @age bei der Initialisierung nicht festlegen (es würde tatsächlich einen Fehler auslösen, wie Sie ihn derzeit haben).

  class Person

    attr_accessor :name, :age

    def initialize(name)
      @name = name
    end

    def birthday
      if @age.nil?
        @age = 1
      else
        @age += 1
      end
    end
  end

Hoffentlich hilft das. Wenn für die Initialisierungsmethode kein Alter festgelegt ist, können Sie das Alter auch in anderen Methoden verwenden / festlegen. In diesem Fall setzt die Person.birthday -Methode beim ersten Aufruf ihre @age auf 1 und erhöht sie dann von dort aus.

0
Sebastian Scholl 18 Jän. 2019 im 18:49

Zum Beispiel, wenn Sie eine Methode aufrufen müssen, um der Instanzvariablen einen Wert zuzuweisen, während Sie das Objekt instanziieren.

Das ist albern, gibt aber eine Idee:

class Person

  attr_accessor :name, :age

  def initialize(name)
    @name = name
    @age = random_age
  end

  def random_age
    rand(1..100)
  end

end

jack = Person.new('jack')
p jack.age #=> 29
0
iGian 18 Jän. 2019 im 20:09