#インスタンスの@@変数のインスタンスについて
dbの接続のインスタンスについて
ruby
1Test1.rb 2require 'mysql2' 3 4class Test1 5 def initialize 6 @hostname = 'hostname' 7 @password = 'password' 8 @username = 'hoge' 9 @dataBaseName = 'databaseName' 10 @@client = connect 11 end 12 13 private 14 def connect 15 client = Mysql2:Client.new(host: @hostname ,username: @username, password: @password , database: @dataBaseName) 16 end 17end 18 19Test2.rb 20require 'mysql2' 21class Test2 < Test1 22 def initialize 23 super 24 @@client.query('set character set utf8') ←該当箇所 25 end 26end 27 28 29test3.rb 30require 'mysql2' 31require 'Test1' 32require 'Test2' 33 34doMysql 35 36def doMysql 37 com = Test2.new() 38 中間処理は省略 39end
このようなファイルの構成でdb接続を考えております。
初回の接続などはうまくいくのですが、2回目などでundefine method 'query' for nil:NilClassでエラーが発生します。
エラー発生箇所 Test2.rbの5行目
確かに@@connectionをtest2.rbのsuperの下でログ出力したところ、nilが帰ってきました。
一度は繋がるが、二度目以降で繋がらない理由がわかりません。
どなたかわかるかたいらっしゃいましたらよろしくお願いします。
エラーが起こるコードを示してください。
書かれているコードだと、メソッド定義だけで、何も実行されません。
エラーが起こらないコードだけ示されてもどうしようもないです。
また、require "test1.rb" などが漏れていると思われます。
ご指摘ありがとうございます。
test3.rbが実行され。com = Test2.new()が実行されたタイミングでTest2.rbと親クラスであるTest1.rbが実行されると思います。一度目のインスタンス作成には成功するのですが、二度目のインスタンス作成で失敗し、nilで返って来てdbの接続情報が取得できず、undefine method 'query' for nil:NilClassを発生している状態です。
そもそも、connCloseする必要はあるのでしょうか?
Test1のinitialize内で
@@connection ||= connect
にして、connCloseしないのが定石に思いますが
test3.rbは、メソッド定義しかないので、何も実行されません。なので、com = Test2.new() も実行されることはありません。
本当に実行していますか?実行したコードを修正せずに載せてください。
>asmさん
おっしゃる通り、@@connection ||= connectを試したところうまく行きました。ただ、なぜ定義が入る時と入らな時があるのかもしおわかりでしたら教えていただけますでしょうか?
>tonさん
確かにメソッド定義だけでしたので実行しても動かないですね。
失礼しました。
回答1件
あなたの回答
tips
プレビュー