Вопрос по ruby – Методы класса (ruby)

1

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

class Animal
  attr_accessor :noise, :color, :legs, :arms

  def self.create_with_attributes(noise, color)
    animal = self.new(noise)
    @noise = noise
    @color = color
    return animal
  end

  def initialize(noise, legs=4, arms=0)
    @noise = noise
    @legs = legs
    @arms = arms
    puts "----A new animal has been instantiated.----"
  end
end

animal1 = Animal.new("Moo!", 4, 0)
puts animal1.noise
animal1.color = "black"
puts animal1.color
puts animal1.legs
puts animal1.arms
puts

animal2 = Animal.create_with_attributes("Quack", "white")
puts animal2.noise
puts animal2.color

Когда я использую метод классаcreate_with_attributes (на животных.2), я ожидаю"white" появляться, когда яputs animal2.color.

Кажется, что я определил это с помощьюattr_accessor точно так же как у меня есть «шум», и все же шум появляется правильно, в то время как цвет не будет. Я не получаю сообщение об ошибке при запуске этой программы, но атрибут .color просто не отображается. Я считаю, что это потому, что я как-то неправильно обозначил это в коде.

Ваш Ответ

2   ответа
3

self.create_with_attributes это метод класса, поэтому установка@noise а также@color внутри этоnot установка переменной экземпляра, но вместо этого то, что известно какпеременная экземпляра класса.

То, что вы хотите сделать, это установить переменные для экземпляра, который вы только что создали, поэтому вместо этого изменитеself.create_with_attributes выглядеть примерно так:

 def self.create_with_attributes(noise, color)
     animal = self.new(noise)
     animal.noise = noise
     animal.color = color
     animal
 end

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

Error: User Rate Limit Exceeded Jeff H.
Error: User Rate Limit ExceededinitializeError: User Rate Limit Exceededanimal.noise = noiseError: User Rate Limit Exceededself.create_with_attributesError: User Rate Limit Exceeded
Error: User Rate Limit Exceededreturn animalError: User Rate Limit Exceededself.create_with.attributes methodError: User Rate Limit Exceeded Jeff H.
Error: User Rate Limit ExceededdoError: User Rate Limit ExceededreturnError: User Rate Limit Exceededgist.github.com/a29e73325cd42eaeb16dError: User Rate Limit Exceeded
Error: User Rate Limit Exceeded Jeff H.
1

Когда вы находитесь вcreate_with_attributes метод, переменные экземпляра устанавливаются наAnimal сам класс, а не в случаеAnimal Вы только что создали. Это потому, что метод находится наAnimal класс (который является экземпляромClass), и, следовательно, он запускается в этом контексте, а не в контексте какого-либо экземпляраAnimal, Если вы делаете:

Animal.instance_variable_get(:@color)

после запуска метода, как вы описали, вы должны получить"white" назад.

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

def self.create_with_attributes(noise, color)
  animal = self.new(noise)
  animal.color = color
  return animal
end

Я убрал настройкуnoise так как это сделано в вашемinitialize тем не мение.

Error: User Rate Limit Exceeded Jeff H.

Похожие вопросы