Требовать файл без выполнения кода? - PullRequest
17 голосов
/ 19 сентября 2010

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

file.rb

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

puts "This will be outputted."

main.rb

require "./file"

При запуске main.rb он загрузит весь кодвнутри file.rb, поэтому я получу «Это будет выведено».на экране.

Можно ли загрузить файл, не запуская код?

Причина Я хочу загрузить все методы (в модулях и классах тоже) без необходимости выполнениякод за пределами этих областей.

Ответы [ 3 ]

36 голосов
/ 19 сентября 2010

Можно ли загрузить файл без запуска кода?

Нет, все в файле ruby ​​является исполняемым кодом, включая определения классов и методов (вы можете увидеть это, когда попытаетесь определить метод внутри оператора if, например, который работает просто отлично). Поэтому, если вы не выполняете ничего в файле, ничего не будет определено.

Однако вы можете сказать ruby, что определенный код должен выполняться только в том случае, если файл запускается напрямую, а не в том случае, если это требуется. Для этого просто поместите рассматриваемый код внутри блока 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"
7 голосов
/ 19 сентября 2010

if __FILE__ == $0 это хорошо, но в большей степени в соответствии с объектно-ориентированным подходом ruby ​​нужно поместить все методы, к которым вы хотите получить доступ, в классе (как методы класса), а затем вызвать их из main.rb.

, например

file.rb

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

и затем в main.rb

require "/.file.rb"

и когда вы хотите использовать служебные методы:

MyUtils.method
1 голос
/ 24 октября 2011

Я не думаю, что изменение файла - это хорошая идея - таких файлов может быть много, или эти файлы принадлежат заказчику, и множество других причин.

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
...