From: Takaaki Tateishi Date: 2006-03-12T15:09:37+09:00 Subject: [ruby-list:41907] Re: "win32/registry" と "dl/win32" の相性について take_tk wrote: >>> "dl/win32" の Win32API を前提とするメソッドで、 >>> no implicit conversion from nil to integer (TypeError) ... > これは、dl/win32 の Win32API にたいする互換性の問題で、おそらくは、 > Integerを期待しているメソッドに対してnilを送ったときの動作の非互換性の問 > 題。 問題点がよく分からないので少し確認したいのですが、まず、この "no implicit conversion from nil to integer (TypeError)" のエラーは、Win32API.soにおける エラーです。試しに、次のプログラムを動作させてみました。 このプログラムでは、先のmessage_boxメソッドにnilを第一引数に与えています。 require "Win32API" MessageBox = Win32API.new( 'user32' , 'MessageBox' , %w(N P P N) , "N" ) def message_box( handle,text,caption,type=0 ) MessageBox.call( handle , text , caption ,type ) end message_box( nil, "hello" , "" , 0 ) エラーメッセージは次の通りです。 t2.rb:5:in `call': no implicit conversion from nil to integer (TypeError) from t2.rb:5:in `message_box' from t2.rb:7 次に、dl/win32を使った場合には、次のようなエラーがでます。 /usr/local/lib/ruby/1.8/dl/win32.rb:18:in `pack': can't convert nil into Integer (TypeError) from /usr/local/lib/ruby/1.8/dl/win32.rb:18:in `call' from t2.rb:1:in `each_with_index' from /usr/local/lib/ruby/1.8/dl/win32.rb:16:in `call' from t2.rb:5:in `message_box' from t2.rb:7 これらのことを考慮した上で、次の(a),(b)について考えます。 > (a)dl/win32 で、この非互換性が生じている部分を見つけて Win32API 互換 > になるように変更するか、 すでにnil->0の自動変換はdl/win32,Win32APIともに行われず、エラーになるということは確認 できたわけですが、全く同じエラーを出るようにすべきだという意見はあるかと思います。 > (b)win32/registory を訂正する、 当初の問題は、値の自動変換による互換性ではなく、[ruby-list:41886]にあるようにdl/win32.rb とWin32API.soを*併用*したときの問題だと思います。 そうであれば、registoryを修正するのではなく、(1)併用しても大丈夫なようにdl/win32を修正す る方法と、(2)併用できないようにする方法があります。絶対に併用しなければならない状況という ものもないような気がするので、比較的簡単に対処ができる(2)の方が良いと思います。 (2)の場合、変更すべきはdl/win32において、require 'dl/win32'を行ったら$LOADED_FEATURES にWin32API.soを加えたり、あるいは、先にWin32API.soがロードされていたら警告を出すという 方法などで対処できるでしょうし、そうすべきだったとは思います。 -- Takaaki Tateishi