2016-10-31 7 views
0

Я получаю сообщение об ошибке:Получение неинициализированной постоянной ошибки при попытке создать экземпляр нового класса

lynda.rb:206:in `<main>': uninitialized constant Pig (NameError) 

, когда я пытаюсь создать экземпляр нового экземпляра класса свиней. Кто-нибудь знает, почему я получаю эту ошибку? Я искал в Интернете, и мне сказали, что обычно это связано с тем, что вы не требуете своего родительского класса. Однако мой родительский класс находится в одном файле.

class Animal 
    attr_accessor :name 
    attr_writer :colour 
    attr_reader :legs, :arms 

def initialize(noise,legs=4,arms=0) 
    @noise = noise 
    @legs = legs 
    @arms = arms 

    puts "A new animal has been instantiated" 
end 

def noise=(noise) 
    @noise = noise 
end 

def noise 
    @noise 
end 



    class Pig < Animal 
    def noise 
     parent_method = super 
     puts "Hello and #{parent_method}" 
    end 
end 

    class Cow < Animal 
    end 
end 

piggy = Pig.new("oink") 
p piggy.noise 

ответ

2

Вы определили Pig класс внутри Animal класса.

Несмотря на то, что это, скорее всего, не то, что вы хотели, чтобы это было, чтобы решить эту проблему, вы хотите, чтобы правильно ссылаться на классе:

piggy = Animal::Pig.new("oink") 

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

piggy = Pig.new("oink") 
+0

Ahh Я вижу. Я пробовал в обоих направлениях. Спасибо, я никогда не понимал, что Ruby не знает, где найти подкласс Pig, если вы не укажете. Очень признателен. –

+0

Джек, это не столько не знать, где найти подклассы; проблема подкласса - это красная селедка. Это то, что вы _contained_ ваш класс Pig _inside_ класс Animal (и я имею в виду _class_, а не файл); вы столкнулись бы с той же проблемой, даже если Pig не был подклассом Animal, просто потому, что вы открыли Pig перед закрытием Animal. – philomory