如何组织嵌套类的目录和文件

时间:2014-11-04 07:04:16

标签: ruby nested-class

我有这样的课程:

require 'active_support/core_ext'

class Shelf
  def initialize
    @books = {}
  end
  def book(code: code)
    @books[code] if @books.has_key?(code)
    @books = Book.new(code: code)
  end
end

class Shelf::Book
  def initialize(code: code)
    @code = code
  end
end

如果我把它写在文件中,它可以正常工作。

我想将类分成两个文件shelf.rbshelf/book.rb,但是当我在require_relative 'shelf/book'中编写shelf.rb时,它会失败,因为class Shelf未定义爱好。

我应该如何组织文件和目录? 或者我是否以完全错误的方式使用嵌套类?

2 个答案:

答案 0 :(得分:1)

您可以编写另一个不包含类定义但将用于运行程序/脚本的文件。

在此文件的顶部

require_relative 'shelf'
require_relative 'shelf/book'

#more code instructions

你不需要在shelf.rb中require 'shelf/book'

答案 1 :(得分:1)

Read this用于命名*.rb文件的约定。根据它,如果你有一个班级Shelf

class Shelf
end

然后您的文件名应为shelf.rb,如果您有一个名为Shelf::Book的类,则文件名book.rb应位于 shelf 目录中(当然这不是一个约束或强制要求它在 shelf 目录中,但它是一个很好的约定,因为任何其他开发人员将能够找到您的文件 book.rb 轻松):

class Shelf::Book
end

但是,您的问题在于Shelf::Book中需要Shelf,因为您需要在require_relative 'shelf/book'类定义中调用Shelf,因为Ruby不会知道关于Shelf之前是一个类。像这样:

class Shelf
  require_relative 'shelf/book'
end

但是,如果您不希望Shelf类的定义抛出错误而不管您在哪里使用行:require_relative 'shelf/book',那么将shelf/book.rb更改为以下内容:

class Shelf
  class Book
    def initialize(code: code)
      @code = code
    end
  end
end

因为这里Ruby打开/创建了一个类Shelf并且不会抛出这个错误:

  

`':未初始化的常量Shelf(NameError)