2012-04-03 6 views
2

Если я нахожу x.rb, then all the classes in that file are loaded. Можно ли проверить и посмотреть, какие классы используются и загружать только эти классы?Загрузите только те классы, которые используются в Ruby?

Предполагая, что x.rb содержит классы Hello и Goodbye, а моя программа использует Hello Class, можно ли загружать только класс Hello?

Счастливый скрипт, который проверяет документ и выводит .rb, который имеет только класс Hello и код, который его использует ... Был бы интересный проект github, если он не существует, но я думаю, что это не так моего набора навыков atm.

+2

Нет, это не возможно. Исходные файлы загружаются и оцениваются полностью. Почему бы не использовать отдельные файлы? –

+1

Время и память, которые вы и компьютер тратите на загрузку только класса Hello, вероятно, будут больше, чем просто загрузка Goodbye вместе с ним. – benzado

ответ

2

Когда классы определены в своем собственном отдельном файле, вы могли использовать метод autoload ¹²:

autoload :Hello, 'x/hello' 
autoload :Goodbye, 'x/goodbye' 

Когда вы пишете Hello, вы на самом деле с доступом к постоянной Hello. autoload использует const_missing, чтобы автоматически потребовать файл, если константа не определена.

Обратите внимание, что мы по-прежнему имеем дело с файлами здесь. Содержимое x/hello.rb будет просто прочитано и оценено. Этот код может выполнять любую операцию. Он может require другие файлы. Он мог бы определить миллион других классов.

Это потому, что исходный код - это просто текст. Это особенно верно для интерпретируемых языков. Например, in Java, you can usually only declare one public type per "compilation unit". В Ruby нет такой вещи.


¹ Matz strongly discourages the practice

² Ruby Inside article on autoload

0

ПРИМЕЧАНИЕ: Я неправильно прочитал часть вопроса, а другая часть как-то уклонилась от меня ... Я, должно быть, многозадачный много времени. Во всяком случае, этот ответ отвечает только на половину вопроса и неверно; просто говорю.

Хорошо, вот, возможно, дорогой способ, но попробовать что-то вроде этого:

$ cat definer.rb 
class Foo 
    def greet(person) 
    puts "Hello, #{person}!" 
    end 
end 
Bar = Class.new 

$ cat finder.rb 
$LOAD_PATH << File.dirname "." 
before = Object.constants 
require 'definer' 
after = Object.constants 
print (before - after).join(" ") 

$ cat looker.rb 
differences = `ruby finder.rb`.split(" ") 
puts "The following constants will be defined when finder.rb is loaded: #{differences.join(", ")}" 

Теперь для очистителя и пути, вы можете использовать сокеты. Я приведу пример этого.

+0

Не вижу связи с вопросом? –

+0

Он будет печатать все константы, которые определяет 'definer.rb', без фактического выполнения в основной программе. – Jwosty

+0

Подождите минуту ... Я думаю, что я отправил неправильный вопрос ... * facepalm * – Jwosty

Смежные вопросы