2012-03-30 27 views
4

私はRubyを習得している経験豊富なプログラマーです。 私はSQLite3を使ってデータベースを設定しようとしています。 Rubyをもっと学ぶために、私はSQLite3をトレースしています。 私が理解していないのは、データベースおよびステートメントクラスの#newのコードはどこにありますか? 実際には、#新しいメソッドではなく、#initializeメソッドを期待しています。SQLite3 :: DatabaseとSQLite3 :: Statementの初期化メソッドはどこにありますか

上記の2つの文は、ドキュメントに記載されています。 しかし、私はこの

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

に追跡しようとすると、私のコードでは、それはわずか手順。

その後、私は私がDatabase.rbファイル内#execute方法に入るん

#$db.execute 

にトレースしてみてください、しかし、それは私が

にステップインしようとする#prepareメソッドを呼び出したときに
stmt = SQLite3::Statement.new(self, sql) 

しかし、もう一度運がありません。それはそれを乗り越えるだけです。

私はソースコードを調べたり、検索を完了しましたが、呼び出されている初期化メソッドを見つけることができません。彼らはどこにいる ?

この問題をご検討いただきありがとうございます。

答えて

2

initialize method for SQLite3::DatabaseはCで実装されている:

/* 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) 

同様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) 

ルビーデバッガはSQLite3の拡張もされていると仮定すると(C関数にステップする方法を知りませんデバッグサポートでコンパイルされているので)、それらをスキップします。

+0

ありがとうございました。しかし、それは新しい疑問を提起する。まず、Rubyはどのように '#xxx.new'を解決しますか?たとえば、まずRubyファイルで#initializeメソッドを検索し、失敗すると "C"コードを探しますか?次に、Cコードはどのようにリンクされていますか? SQLite3用のgemフォルダ内のobjファイルまたはライブラリですか? – Will

+0

ps。 (私はstackOverflowに新しいです) - 私の上記のコメントは適切ですか?それともチャットですか、別の質問ですべきですか?ありがとう。 (私の要点を扱っています!) – Will

+0

@WilliamSmith:Cファイルの一番下を見ると、物事を結びつける 'rb_define_method'呼び出しがあります。 Cファイルはライブラリにコンパイルされ、必要に応じて動的にロードされます。あなたは、少しのグーグルでC拡張チュートリアルを見つけることができるはずです。コメントは大丈夫です、私たちのほとんどはここにフレンドリーです(または少なくとも、ふりをする:)。 –

関連する問題