2010-09-19 7 views
15

Aquí tengo dos archivos:¿Requiere archivo sin ejecutar el código?

file.rb

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

puts "This will be outputted." 

main.rb

require "./file" 

Cuando se ejecuta main.rb se carga todo el código dentro de file.rb por lo que se obtener "Esto será enviado". en la pantalla.

¿Es posible cargar un archivo sin tener que ejecutar el código?

Causa Quiero cargar todos los métodos (en módulos y clases también) sin tener que ejecutar código fuera de estos ámbitos.

+0

Podría reformular por qué es necesario esto? – tisba

+0

Es solo para una aplicación que estoy escribiendo, cargar todos los módulos, clases y métodos de un grupo de archivos, pero no ejecutar ningún código en absoluto. Porque tal vez alguien olvidó eliminar algún código externo. –

+1

¿Hay una diferencia entre 'require' y' load' o algo donde una versión agrega variables locales definidas en ese archivo, pero la otra forma no? –

Respuesta

32

¿Es posible cargar un archivo sin tener que ejecutar el código?

No, todo en un archivo de rubí es un código ejecutable, incluyendo la clase y definiciones de métodos (se puede ver esto cuando se intenta definir un método dentro de una sentencia if por ejemplo, que funciona muy bien). Entonces, si no ejecuta nada en el archivo, no se definiría nada.

Sin embargo, puede decirle a ruby ​​que cierto código solo se ejecutará si el archivo se ejecuta directamente, no si es necesario. Para esto simplemente ponga el código en cuestión dentro de un bloque if __FILE__ == $0. Así que para su ejemplo, esto funcionaría:

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

tiene este derecho; Si el archivo no se ejecuta, no tendrá acceso a las clases o métodos en el archivo. Buen truco con el 'if __FILE__ == $ 0'. –

+0

Entonces, ¿cómo ejecuta el código más tarde cuando lo desea? Al igual que, por ejemplo, los complementos, cárguelos al principio pero solo ejecútelos en el momento apropiado. ¿Acabas de empezar a usar un método del código y se ejecutará? – Thermatix

7

la if __FILE__ == $0 es agradable, pero de una manera más acorde con el enfoque orientado a objetos de Ruby es para poner todos los métodos a los que desea acceder en una clase (como métodos de clase), y luego llamarlos desde main.rb.

p. Ej.

file.rb

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

y luego en main.rb

require "/.file.rb" 

y cuando se quiere utilizar sus métodos de utilidad:

MyUtils.method 
1

No creo que la modificación El archivo es una buena idea: puede haber muchos archivos como este o estos archivos pertenecen al cliente y un montón de otras razones.

Ruby es bueno en la metaprogramación, ¿por qué no utilizar esta característica?

Podría ser así.

Crear archivo con módulo falso y poner aquí el archivo.

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

A continuación, cargue este archivo:

require "/.mfile.rb 

y acceder al método:

FakeModule::method 
Cuestiones relacionadas