如何在我的space的父类的超类所具有的命名空间中使用方法?

时间:2012-07-31 20:26:32

标签: ruby

我有Book < LibraryItem

Book::Page,定义为

class Book
  class Page

in models / book / page.rb

LibraryItem有一个名为can_edit?

的方法

但是我的Book::Page.new.can_edit?没有返回方法错误...

如何在我的命名空间中包含LibraryItem的实例方法?

3 个答案:

答案 0 :(得分:1)

这会返回错误,因为Page没有can_edit?方法。 Book具有Page类,但Page不是Library项的子类(仅Book是)。因此can_edit?Book有效,但对Page无效。

尝试

p Book::Page.superclass

您将获得Object

答案 1 :(得分:1)

根本问题是ruby不支持多重继承。问题like this onethis one指出您应该考虑将功能扩展到可以在类定义中任意包含的模块。

答案 2 :(得分:1)

如果您在irb控制台上运行此代码,Ruby默认情况下会访问父方法:

class LibraryItem
  def can_edit?
    true
  end
end

class Book < LibraryItem
  class Page
  end
end

您可以轻松访问can_edit吗?方法,只是做:

book = Book.new
book.can_edit?

但是从Page类中,您无法访问LibraryItem方法,因为它不在继承链

提示:对于命名空间,使用模块而不是嵌套类。