2012-04-03 12 views
2

Wenn ich x.rb laden, then all the classes in that file are loaded. Ist es möglich zu überprüfen und zu sehen, welche Klassen verwendet werden und diese nur laden?Laden Sie nur, welche Klassen in Ruby verwendet werden?

Angenommen, dass x.rb sowohl Hello als auch Goodbye-Klassen enthält und mein Programm nur die Hello-Klasse verwendet, ist es möglich, nur die Hello-Klasse zu laden?

Happy mit einem Skript, das das Dokument überprüft, und gibt ein .rb aus, das nur die Hello-Klasse und den Code, der es verwendet ... Wäre ein interessantes Github-Projekt, wenn es nicht existiert, aber ich denke, es ist out meiner Fähigkeiten atm.

+2

Nein, das ist nicht möglich. Quelldateien werden vollständig geladen und ausgewertet. Warum nicht separate Dateien verwenden? –

+1

Die Zeit und der Speicher, die Sie und der Computer auf das ausschließliche Laden der Hello-Klasse aufwenden, wird wahrscheinlich größer sein, als einfach Goodbye zusammen mit ihm zu laden. – benzado

Antwort

2

Wenn Klassen in ihren eigenen separaten Datei definiert sind, können Sie könnte die autoload ¹² Methode verwenden:

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

Wenn Sie Hello schreiben, die Sie zugreifen, tatsächlich die Hello konstant. autoload verwendet const_missing, um automatisch eine Datei anzufordern, wenn die Konstante nicht definiert ist.

Beachten Sie, dass wir hier immer noch mit Dateien zu tun haben. Der Inhalt von x/hello.rb wird einfach gelesen und ausgewertet. Dieser Code kann jede Operation ausführen. Es kann require andere Dateien. Es könnte eine Million andere Klassen definieren.

Das ist, weil Quellcode wirklich nur Text ist. Dies gilt insbesondere für interpretierte Sprachen. Zum Beispiel in Java, you can usually only declare one public type per "compilation unit". In Ruby gibt es so etwas nicht.


¹ Matz strongly discourages the practice

² Ruby Inside article on autoload

0

HINWEIS: Ich habe einen Teil der Frage falsch gelesen und der andere Teil wich mir irgendwie aus ... Ich muss Multitasking gewesen sein. Wie auch immer, diese Antwort beantwortet nur die Hälfte der Frage und falsch; sag nur.

Okay, hier ist eine möglicherweise teure Art und Weise, sondern versuchen, so etwas wie dieses:

$ 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(", ")}" 

nun für eine sauberere und Weise könnten Sie Sockets verwenden. Ich werde ein Beispiel dafür bekommen.

+0

Ich sehe die Verbindung zu der Frage nicht? –

+0

Es werden alle Konstanten gedruckt, die 'definer.rb' definiert, ohne dass dies tatsächlich im Hauptprogramm geschieht. – Jwosty

+0

Warten Sie eine Minute ... Ich denke, ich habe auf die falsche Frage geschrieben ... * facepalm * – Jwosty

Verwandte Themen