2012-03-30 7 views
4

Ich bin ein erfahrener Programmierer Ruby lernen (und es sehr zu mögen). Ich arbeite an der Einrichtung einer Datenbank mit SQLite3. Um Ruby besser zu lernen, suche ich nach SQLite3. Was ich nicht verstehe ist, wo ist der Code für #new für die Database und Statement-Klassen. Eigentlich erwarte ich keine #new-Methode, sondern eine #initialize-Methode.Wo sind die Initialize-Methoden für SQLite3 :: Database und SQLite3 :: Statement

SQLite3::Database.new(file, options = {}) 
SQLite3::Statement.new(db, sql) 

Die obigen beiden Aussagen stammen aus der Dokumentation. Aber in meinem Code, wenn ich versuche in diesen

$db = SQLite3::Database.new"MyDBfile" 

zu verfolgen es nur ein paar Schritte über.

Dann später, wenn ich versuche in

#$db.execute 

nachzuzeichnen ich in die #execute Methode in der Database.rb-Datei erhalten, aber dann ruft es die #prepare Methode, wo ich versuche, in

zu Schritt
stmt = SQLite3::Statement.new(self, sql) 

aber wieder kein Glück. Es geht nur darüber hinweg.

Ich habe den Quellcode, Suchen usw. durchforstet, aber ich kann die Initialisierungsmethoden nicht finden, die aufgerufen werden. Wo sind sie ?

Vielen Dank für die Berücksichtigung dieser Frage.

Antwort

2

Die initialize method for SQLite3::Database ist in C implementiert:

/* call-seq: SQLite3::Database.new(file, options = {}) 
* 
* Create a new Database object that opens the given file. If utf16 
* is +true+, the filename is interpreted as a UTF-16 encoded string. 
* 
* By default, the new database will return result rows as arrays 
* (#results_as_hash) and has type translation disabled (#type_translation=). 
*/ 
static VALUE initialize(int argc, VALUE *argv, VALUE self) 

Ebenso für SQLite3::Statement:

/* call-seq: SQLite3::Statement.new(db, sql) 
* 
* Create a new statement attached to the given Database instance, and which 
* encapsulates the given SQL text. If the text contains more than one 
* statement (i.e., separated by semicolons), then the #remainder property 
* will be set to the trailing text. 
*/ 
static VALUE initialize(VALUE self, VALUE db, VALUE sql) 

Der Ruby-Debugger nicht weiß, wie in C-Funktionen Schritt (vorausgesetzt, die SQLite3 Erweiterungen sind sogar kompiliert mit Debugging-Unterstützung), so dass es überspringt.

+0

Vielen Dank dafür. Aber es wirft neue Fragen auf. Erstens, wie löst Ruby ein "# xxx.new" auf? Sucht es zum Beispiel zuerst nach einer #initialize-Methode in einer Ruby-Datei, und wenn dies fehlschlägt, sucht es nach dem "C" -Code? Zweitens, wie ist der C-Code verknüpft? Ist es eine Obj-Datei oder Bibliothek im Edelsteinordner für SQLite3? – Will

+0

ps. (Ich bin neu bei stackOverflow) - Ist mein obiger Kommentar angemessen? Oder sollte es ein Chat oder gar eine separate Frage sein? Vielen Dank. (Arbeiten an meinen Punkten!) – Will

+0

@WilliamSmith: Wenn Sie auf den Boden der C-Dateien schauen, werden Sie die 'rb_define_method' Aufrufe sehen, die Dinge zusammenkleben. Die C-Dateien werden in die Bibliothek kompiliert und bei Bedarf dynamisch geladen. Sie sollten in der Lage sein, ein C-Erweiterung-Tutorial mit ein wenig Googeln zu finden. Die Kommentare sind in Ordnung, die meisten von uns hier sind freundlich (oder zumindest so zu tun :). –