2009-06-26 15 views
32

Per un po 'ho incluso un'intera classe all'interno di un modulo Ruby. Apparentemente questo non è quello che dovrei fare. Sembra che il punto di un modulo sia quello di memorizzare funzioni che possono quindi essere incluse come metodi in una nuova classe.Inclusione di una classe Ruby da un file separato

Non voglio questo. Ho una classe che voglio tenere in un file separato a cui posso accedere da altri file. Come posso fare questo?

Grazie.

+0

Questo post chiarisce l'espressione require_relative in caso di problemi con l'esempio precedente quando su Ruby> = 1.9.2 [Ruby require_relative example] (http://stackoverflow.com/questions/3672586/what-is -require-relative-in-ruby) – Dirk

risposta

55

I moduli hanno un doppio scopo come supporto per funzioni e come spazio dei nomi. Mantenere le classi nei moduli è perfettamente accettabile. Per mettere una classe in un file separato, basta definire la classe come al solito e quindi nel file in cui si desidera utilizzare la classe, semplicemente inserire require 'name_of_file_with_class' nella parte superiore. Ad esempio, se ho definito la classe Foo in foo.rb, in bar.rb avrei la riga require 'foo'.

Se si utilizza Rails, questo includono spesso avviene in automatico

Edit: chiarimento del layout di file

#file: foo.rb 
class Foo 
    def initialize 
    puts "foo" 
    end 
end 

...

#file: bar.rb 
require 'foo' 

Foo.new 

Se siete in Rails, ha messo questi classi in lib/ e utilizzare la convenzione di denominazione per i file di versione minuscola sottolineata del nome della classe, ad esempio Foo ->foo.rb, FooBar ->foo_bar.rb, ecc

Come di Ruby versione 1.9 è possibile utilizzare require_relative, per richiedere i file relativamente al file che si sta modificando.

+0

grazie, molto utile. potresti chiarire l'ultima frase? sembra che tu abbia avuto un errore di battitura (?). Se la classe pippo è memorizzata in bar.rb, ho bisogno di "pippo" in bazcontroller.rb? Allora foo.new è utilizzabile in bazcontroller.rb? – user94154

+9

Forse sarebbe bello aggiungere alcune informazioni su 'require_relative' per Ruby 1.9 poiché il codice non funziona per questa versione. – boutta

+2

@boutta Grazie per il chiarimento 1.9, questo ha risolto il mio problema. – DorkRawk

Problemi correlati