ruby で kconv を require できなくて困っています。
理由を教えてください。
ほかに調査するために必要な実行コマンドがありましたら、
追記致しますのでお教えください。
@ubuntu:$ uname -a
Linux ubuntu 3.0.0-12-server #20-Ubuntu SMP Fri Oct 7 16:36:30 UTC 2011 x86_64 x86_64 x86_64 GNU/Linux
@ubuntu:$ which ruby
/usr/bin/ruby
@ubuntu:$ which irb
/usr/bin/irb
@ubuntu:$ ruby -v
ruby 1.8.7 (2011-06-30 patchlevel 352) [x86_64-linux]
@ubuntu:$ ls -l /usr/lib/ruby/1.8 | grep kconv
-rw-r--r-- 1 root root 8319 2011-07-27 20:21 kconv.rb
@ubuntu:$ irb
irb(main):001:0> $:.each do |path|
irb(main):002:1* puts(path)
irb(main):003:1> end
/usr/local/lib/site_ruby/1.8
/usr/local/lib/site_ruby/1.8/x86_64-linux
/usr/local/lib/site_ruby
/usr/lib/ruby/vendor_ruby/1.8
/usr/lib/ruby/vendor_ruby/1.8/x86_64-linux
/usr/lib/ruby/vendor_ruby
/usr/lib/ruby/1.8
/usr/lib/ruby/1.8/x86_64-linux
.
=> ["/usr/local/lib/site_ruby/1.8",
"/usr/local/lib/site_ruby/1.8/x86_64-linux",
"/usr/local/lib/site_ruby",
"/usr/lib/ruby/vendor_ruby/1.8",
"/usr/lib/ruby/vendor_ruby/1.8/x86_64-linux",
"/usr/lib/ruby/vendor_ruby",
"/usr/lib/ruby/1.8",
"/usr/lib/ruby/1.8/x86_64-linux", "."]
irb(main):004:0>
irb(main):005:0*
irb(main):006:0* require 'kconv'
=> false
irb(main):007:0>
http://doc.ruby-lang.org/ja/1.9.2/doc/index.html
「オブジェクト指向スクリプト言語 Ruby リファレンスマニュアル」の、
「組み込みライブラリ」の Builtin libraries から、Module Kernel の require の項を参照ください。
http://doc.ruby-lang.org/ja/1.9.2/class/Kernel.html
ライブラリのロードに成功した時には true を返し、ロードした feature の名前を(拡張子も含めて) 変数 $" に追加します。ただし、feature の名前が既に $" に含まれていた場合はロードせずに false を返します。
古いマニュアルだと、もっとズバリと書かれてたんですけどね。
http://www.ruby-lang.org/ja/old-man/html/_C1C8A4DFB9FEA4DFB4D8BFF4.html#require
実際にライブラリをロードした時には true、既にロードされている時には false を返します。ロードに失敗した場合は、例外 LoadError が発生します。
load の項も、合わせて確認しておくと、良いと思います。
require ’zlib’ で false になる - 36丁目 オレオダウンローダー
これが参考になりませんか。
kconvは標準添付だし関係ないか…
require 'kconv'でfalseはコメント蘭の通り、$"でkconv.rbがあってもfalseになりますね。
kconvの処理がうまくいかない(?)ならファイルの文字コードがおかしいとか。
Rubyist Magazine - 標準添付ライブラリ紹介 【第 3 回】 Kconv/NKF/Iconv
というのは、具体的に、どう見えてくるのですか?
irb で、require "kconv.rb" とやって、true が返ってこない?
はい。
最初の質問に記載している通り、falseが返ってくる状態です。
>>irb(main):005:0*
>>irb(main):006:0* require 'kconv'
>>=> false
質問に書いてありますね ><
require "kconv"
ではなく、
require "kconv.rb"
と書いても、false が返ってきますか?
>requireは実際にロードした時には true,既にロードされている時にはfalseを返します.
>またロードしたfeatureの名前を(拡張子も含めて),変数 $"に追加します.
とあります。
irb 起動直後の $" を確認してみてください。
>Ruby のマニュアルで、require のところには、
ありがとうございます。
そうなのですね。既にロードされていたのですね。
もしよろしければ、本件が記載されていた RubyのマニュアルのURLを教えて頂けると助かります。
>irb 起動直後の $" を確認してみてください。
おっしゃる通りに、すでにロードされているようでした。
以下、irb実行結果です。
$ irb
irb(main):001:0> $".each do |lib|
irb(main):002:1* puts lib
irb(main):003:1> end
enumerator.so
e2mmap.rb
irb/init.rb
irb/workspace.rb
irb/context.rb
irb/extend-command.rb
irb/output-method.rb
irb/notifier.rb
irb/slex.rb
irb/ruby-token.rb
irb/ruby-lex.rb
readline.so
irb/input-method.rb
irb/locale.rb
irb.rb
nkf.so
kconv.rb
=> ["enumerator.so", "e2mmap.rb", "irb/init.rb", "irb/workspace.rb", "irb/context.rb", "irb/extend-command.rb", "irb/output-method.rb", "irb/notifier.rb", "irb/slex.rb", "irb/ruby-token.rb", "irb/ruby-lex.rb", "readline.so", "irb/input-method.rb", "irb/locale.rb", "irb.rb", "nkf.so", "kconv.rb"]
1.8 になってから、かなりドキュメントも書き込まれてるので、
Ruby でも、まず、マニュアルに当たってみる、というのが良いと思います。