0

私はBook < LibraryItem

およびaBook::Pageは、次のように定義されます。

class Book
  class Page

models / book/page.rbにあります

LibraryItemと呼ばれるメソッドがありますcan_edit?

しかし、私Book::Page.new.can_edit?はメソッドエラーを返しません...

LibraryItem名前空間にからのインスタンスメソッドを含めるにはどうすればよいですか?

4

3 に答える 3

1

Pageメソッドがないため、これはエラーを返しますcan_edit?。ABookにはPageクラスがPageありますが、アイテムのサブクラスではありませんLibrary(のみBookです)。したがってcan_edit?、に対しては有効ですBookが、に対しては有効ではありませんPage

試す

p Book::Page.superclass

そして、あなたは得るでしょうObject

于 2012-07-31T20:36:30.130 に答える
1

根本的な問題は、rubyが多重継承をサポートしていないことです。このような質問やこの質問は、クラス定義に任意に含めることができるモジュールに機能を引き出すことを検討する必要があるという考えを示しています。

于 2012-07-31T20:37:08.710 に答える
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メソッドにアクセスできません。

ヒント:名前空間には、ネストされたクラスではなくモジュールを使用します。

于 2012-07-31T21:00:20.180 に答える