我有这样的课程:
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.rb
和shelf/book.rb
,但是当我在require_relative 'shelf/book'
中编写shelf.rb
时,它会失败,因为class Shelf
未定义爱好。
我应该如何组织文件和目录? 或者我是否以完全错误的方式使用嵌套类?
答案 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)