Требовать файл без выполнения кода?

Здесь у меня есть два файла:

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