5

我是 Ruby 新手。我有一个关于在 Ruby 中使用 Inheritence 的问题。

我在名为 Doggy.rb 的文件中有一个名为 Doggy 的类

class Doggy
  def bark
    puts "Vicky is barking"
  end
end

我在另一个名为 puppy.rb 的文件中编写了另一个名为 Puppy 的类

class Puppy < Doggy
end

puts Doggy.new.bark

我收到此错误:

Puppy.rb:1:in `<main>': uninitialized constant Doggy (NameError)

是否必须将这些类(Doggy 和 Puppy)仅包含在单个文件中?

已编辑

根据建议,我尝试使用 require 和 require_relative 如图所示,但我仍然低于错误

Puppy.rb:1:in `<main>': uninitialized constant Doggy (NameError)

    class Puppy < Doggy
    end
    require_relative 'Doggy.rb'
    puts Doggy.new.bark
4

6 回答 6

5

您应该Doggy从文件 where Puppyis 要求包含类的文件。放

require './doggy'

或者,如果您使用的是 ruby​​-1.9:

require_relative 'doggy'

in puppy.rb(假设文件名是 doggy.rb 和 puppy.rb)。

于 2012-09-09T08:37:55.097 回答
5

puppy.rb文件中进行的更改
假设这两个文件都在同一个目录中,您需要按以下方式要求该文件:

doggy.rb

class Doggy
  def bark
    puts "Vicky is barking"
  end
end

小狗.rb

require File.expand_path('../doggy.rb', __FILE__)
class Puppy < Doggy
end

puts Doggy.new.bark
于 2012-09-09T09:37:44.877 回答
1

在继承自之后Doggy,您正在加载包含 的定义的文件。当然,那是不可能的。如果只加载包含第 3 行定义的文件,如何从第 1 行继承?DoggyDoggyDoggy

于 2012-09-09T09:35:23.827 回答
1

另外,除了其他人所说的,puts Dog.new.bark总是会失败,因为你的类不叫Dog,它是Doggy。谨防。

于 2012-09-09T08:35:56.223 回答
1

没有必要,您必须要求Doggy声明的文件。您可以使用requirerequire_relative

然后,无论如何请确保您使用您声明的名称:Doggy而不是Dog.

于 2012-09-09T08:36:23.830 回答
0

你必须在你的 Puppy 类中包含 Doggy.rb

于 2012-09-09T08:37:49.927 回答