метод инициализации ruby ​​- цель инициализации аргументов - PullRequest
0 голосов
/ 18 января 2019

Я немного запутался в методе инициализации. Я понимаю, что он вызывается автоматически, когда вы делаете Person.new и добавляете к нему аргументы, например Person.new("james"). Я не понимаю, почему в вашем методе инициализации у вас есть переменные экземпляра, которые также не используются в качестве аргумента. Вы можете использовать их позже после создания экземпляра? Увидеть ниже. Какова причина иметь @age в методе инициализации, но не в качестве аргумента. спасибо.

class Person

  attr_accessor :name, :age

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

Ответы [ 3 ]

0 голосов
/ 18 января 2019

Вы можете установить переменную экземпляра в любом методе вашего класса.

initialize - это метод, который выполняется сразу после вызова Person.new.

Все внешние данные для нового объекта передаются через аргументы .new(args).

Ваша линия @age = age - это то же самое, что @age = nil.

Это связано с тем, что age отсутствует в аргументах initialize.

Также у вас есть attr_accessor :age.

Равно, что у вас есть методы:

def age
  @age
end

def age=(age)
  @age = age
end

Таким образом, вы можете установить переменную экземпляра следующим образом:

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

john.age = 5
p john.age #=> 5
0 голосов
/ 18 января 2019

Например, если вам нужно вызвать метод для присвоения значения переменной экземпляра при создании экземпляра объекта.

Это глупо, но дает представление:

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 голосов
/ 18 января 2019

Переменные экземпляра, объявленные внутри вашего метода инициализации, должны быть теми, которые вы хотите установить во время инициализации. В вашем примере класса Person вам не нужно устанавливать @age при инициализации (на самом деле это вызовет ошибку, как у вас сейчас).

  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

Надеюсь, это поможет. Если метод инициализации не имеет установленного возраста, вы все равно можете использовать / установить возраст в других методах. В этом случае при первом вызове метода Person.birthday он установит для @age значение 1, а затем увеличит его оттуда.

...