Я здесь новичок и у меня вопрос о наследовании классов. Я делаю проект CareerFoundry и не могу понять, почему я продолжаю получать сообщение об ошибке:

неинициализированная константа Cat (NameError)

Кроме того, я получаю это, когда вынимаю информацию о Cat, а Dog не инициализируется.

Я предполагаю, что это означает, что я неправильно пишу, что Cat является частью класса Pet, но я подумал, что задам этот вопрос сообществу, и, надеюсь, у него есть ответ.

class Pet
  attr_reader :color, :breed
  attr_accessor :name
  def initialize(color, breed)
    @color = color
    @breed = breed
    @hungry = true
  end
  def feed(food)
    puts "Mmmm, " + food + "!"
    @hungry = false
  end
  def hungry?
    if @hungry
      puts "I\'m hungry!"
    else
      puts "I\'m full!"
    end
    @hungry
  end

  class Cat < Pet
    def speak
      puts "Meow!"
    end
  end

  class Dog < Pet
    def speak
      puts "Woof!"
    end
  end

end

kitty = Cat.new("grey", "Persian")

"Lets inspect our new cat:"
puts kitty.inspect
"What class is this new cat"
puts kitty.class

puppy = Dog.new("Black", "Beagle")
puppy.speak
puts puppy.breed
0
DevShark 4 Апр 2015 в 19:35

2 ответа

Ваши классы Cat и Dog объявлены в области Pet, поэтому, если вы хотите создать объект Cat, вам нужно написать

c = Pet::Cat.new("red", "Maine coon")

Чтобы создать объект Cat так, как вы это делаете, вам нужно извлечь класс Cat вне класса Pet.

class Pet
  attr_reader :color, :breed
  attr_accessor :name
  def initialize(color, breed)
    @color = color
    @breed = breed
    @hungry = true
  end
  def feed(food)
    puts "Mmmm, " + food + "!"
    @hungry = false
  end
  def hungry?
    if @hungry
      puts "I\'m hungry!"
    else
      puts "I\'m full!"
    end
    @hungry
  end
end

class Cat < Pet
  def speak
    puts "Meow!"
  end
end

class Dog < Pet
  def speak
    puts "Woof!"
  end
end

Теперь вы можете просто написать

c = Cat.new("red", "Maine coon")
3
Bartosz Łęcki 4 Апр 2015 в 19:44
Большое спасибо, это сработало отлично. В упражнении это не рассматривалось как возможный ответ, поэтому спасибо за оперативную помощь.
 – 
DevShark
6 Апр 2015 в 11:40

Попробуйте Cat = Pet::Cat

Вы также можете создать module и использовать include

Или просто объявите класс Cat в области ядра

Или просто позвоните в Pet::Cat.new

0
Rivenfall 5 Апр 2015 в 01:20