Требовать файл без выполнения кода?
Здесь у меня есть два файла:
file.rb
def method
puts "This won't be outputted."
end
puts "This will be outputted."
main.rb
require "./file"
При запуске main.rb он загрузит весь код внутри file.rb, поэтому я получу "Это будет выведено". на экране.
Можно ли загрузить файл без его запуска?
Я хочу загрузить все методы (в модулях и классах), не выполняя код вне этих областей.
Ответы
Ответ 1
Можно ли загрузить файл без его запуска?
Нет, все в рубиновом файле - это исполняемый код, включая определения классов и методов (это можно увидеть, когда вы пытаетесь определить метод внутри if-statement, например, который работает просто отлично). Поэтому, если вы не выполнили ничего в файле, ничего не будет определено.
Однако вы можете сказать рубину, что определенный код должен выполняться только в том случае, если файл запускается напрямую - если это не требуется. Для этого просто поместите этот код внутри блока if __FILE__ == $0
. Поэтому для вашего примера это будет работать:
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"
Ответ 2
if __FILE__ == $0
хорош, но способ, более соответствующий рубиновому объектно-ориентированному подходу, состоит в том, чтобы поместить все методы, к которым вы хотите получить доступ в классе (как методы класса), а затем вызвать их из main.rb.
например.
file.rb
class MyUtils
def self.method
puts "this won't be outputted"
end
end
а затем в main.rb
require "/.file.rb"
и когда вы хотите использовать свои методы утилиты:
MyUtils.method
Ответ 3
Я не думаю, что модифицировать файл - это хорошая идея - таких файлов может быть много, например, этот или эти файлы принадлежат клиенту, и тонна других причин.
Ruby хорош в метапрограммировании, так почему бы не использовать эту функцию?
Это может быть так.
Создайте файл с поддельным модулем и поместите здесь файл.
File.open("mfile.rb","w") do |f|
f.write "module FakeModule
"
f.write File.open("file.rb").read
f.write "
end"
end
Затем загрузите этот файл:
require "/.mfile.rb
и доступ к методу:
FakeModule::method