2014-11-04 87 views
0

我上課是這樣的:如何組織目錄和文件嵌套類

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,但是當我寫shelf.rbrequire_relative 'shelf/book'則因爲class Shelf還沒有定義它失敗。

我該如何組織文件和目錄? 或者我用完全錯誤的方式使用嵌套類?

回答

1

您可以編寫另一個不包含類定義但將用於運行程序/腳本的文件。

在這個文件

require_relative 'shelf' 
require_relative 'shelf/book' 

#more code instructions 

的頂部,你不需要require 'shelf/book'在shelf.rb

1

Read this命名的*.rb文件的約定。根據它,如果你有一個類Shelf

class Shelf 
end 

那麼你的文件名應該是shelf.rb,如果你有一個名爲類:Shelf::Book,然後文件名book.rb應在貨架目錄(當然這是不是約束或強制有它在貨架目錄,但它是跟隨,因爲任何其他開發人員將能夠找到您的文件book.rb容易)一個好習慣:

class Shelf::Book 
end 

但是,你的問題是,你如何要求Shelf::Book,在Shelf,對於需要調用require_relative 'shelf/book'Shelf類的定義,因爲紅寶石不會知道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並且不會拋出此錯誤:

`': uninitialized constant Shelf (NameError)

+0

「如果您有一個名爲Shelf :: Book的類,那麼文件名book.rb應該在貨架目錄**內**「你確定嗎?從他們在rubygem網站上的一個例子中,您鏈接到'require'rdoc/data''主類或模塊RDoc :: Data,它似乎並不是這種情況 – 2014-11-04 07:39:03

+0

@AurélienBottazini:當然這不是一個約束,它更多的被認爲是使用該慣例的良好做法。 – Surya 2014-11-04 07:40:26

+0

@AurélienBottazini:另外,請閱讀OP的問題:*我應該如何組織文件和目錄?還是我用完全錯誤的方式使用嵌套類?*。問題清楚地問到關於組織文件和目錄的問題,我沒有理由不在回答中提及這一點。 – Surya 2014-11-04 07:49:14