2010-09-19 12 views
15

Qui ho due file:Richiedi file senza codice di esecuzione?

file.rb

def method 
    puts "This won't be outputted." 
end 

puts "This will be outputted." 

main.rb

require "./file" 

Quando si esegue main.rb verrà caricato tutto il codice all'interno file.rb così lo farò ottenere "Questo sarà emesso." sullo schermo.

È possibile caricare un file senza averlo per eseguire il codice?

Perché voglio caricare tutti i metodi (anche in moduli e classi) senza dover eseguire codice al di fuori di questi ambiti.

+0

Potrebbe riformulare il motivo per cui avete bisogno di questo? – tisba

+0

È solo per un'applicazione che sto scrivendo, per caricare tutti i moduli, le classi e i metodi da un gruppo di file, ma non per eseguire alcun codice. Perché forse qualcuno ha dimenticato di rimuovere qualche codice esterno. –

+1

Esiste una differenza tra 'require' e' load' o qualcosa in cui una versione aggiunge variabili locali definite in quel file, ma l'altra forma no? –

risposta

32

È possibile caricare un file senza averlo per eseguire il codice?

No, tutto in un file di rubino è codice eseguibile, tra classe e di definizioni di metodo (si può vedere questo quando si tenta di definire un metodo all'interno di una se-dichiarazione per esempio, che funziona bene). Quindi se non dovessi eseguire qualcosa nel file, non verrebbe definito nulla.

Si può tuttavia dire che questo codice deve essere eseguito solo se il file viene eseguito direttamente, non se è necessario. Per questo basta inserire il codice in questione all'interno di un blocco if __FILE__ == $0. Così, per il tuo esempio, questo dovrebbe funzionare:

file.rb

def method 
    puts "This won't be outputted." 
end 
if __FILE__ == $0 
    puts "This will not be outputted." 
end 

main.rb

require "./file" 
+1

ha questo diritto; Se il file non viene eseguito, non si avrà accesso alle classi o ai metodi nel file. Bel trucco con 'if __FILE__ == $ 0'. –

+0

Quindi come si esegue il codice più tardi quando lo si desidera? Come per esempio i plug-in, caricali all'inizio ma li eseguono solo nei momenti appropriati. Hai appena iniziato a utilizzare un metodo dal codice e verrà eseguito? – Thermatix

7

il if __FILE__ == $0 è bello, ma un modo più in linea con l'approccio Object Oriented di Ruby è mettere tutti i metodi a cui si desidera accedere in una classe (come metodi di classe), quindi chiamarli da main.rb.

ad es.

file.rb

class MyUtils 
    def self.method 
     puts "this won't be outputted" 
    end 
end 

e poi in main.rb

require "/.file.rb" 

e quando si desidera utilizzare i metodi di utilità:

MyUtils.method 
1

Non credo che la modifica il file è una buona idea - ci possono essere molti file come questo o questi file appartengono al cliente e una tonnellata di altri motivi.

Ruby è buono a metaprogramming quindi perché non utilizzare questa funzione?

Potrebbe essere così.

Creare un file con modulo falso e inserire qui il file.

File.open("mfile.rb","w") do |f| 
    f.write "module FakeModule 
" 
    f.write File.open("file.rb").read 
    f.write " 
end" 
end 

Poi caricare questo file:

require "/.mfile.rb 

e l'accesso al metodo:

FakeModule::method 
Problemi correlati