【ruby小ネタ】$: や File.dirname(__FILE__) が何なのかさっぱり分からなかった件
どうも、最近はプログラムを全然書いてなかったのですがちょうど今日仕事でRubyを書きました。
エンジニアになって1年とちょっと経ち、ある程度簡単なプログラムなら楽しく書けるようにはなってきました。
しかし各言語によってめずらしい(先輩方からすると全然めずらしくもないww)メソッドや記号を見るとテンパる日々ですww
今日は参考に昔先輩が書いたソースを見ることにしたのですが、冒頭部分にこう書いてありました
$: << File.dirname(__FILE__)
これなんやねんww
っていうわけで、今回はLOAD_PATHとFileクラスのFile.dirname()メソッドについての覚書です。
あ、すごく初心者内容ですよ!
まず、$: とは何ものか
$: は$LOAD_PATHの事だそう。
で、自分は$LOAD_PATHすら知らなかった件。
Rubyがライブラリを探すときのパスだそうで、ここに入っているパスの順番で探すそうです。
つーわけで、$LOAD_PATHと$:は同じものだって。
試してみると本当にそうでした(ってあたり前なんですがww)
$ irb irb(main):001:0> p $LOAD_PATH ["/usr/local/lib/ruby/site_ruby/1.8", "/usr/local/lib/ruby/site_ruby/1.8/i686-linux", "/usr/local/lib/ruby/site_ruby", "/usr/local/lib/ruby/vendor_ruby/1.8", "/usr/local/lib/ruby/vendor_ruby/1.8/i686-linux", "/usr/local/lib/ruby/vendor_ruby", "/usr/local/lib/ruby/1.8", "/usr/local/lib/ruby/1.8/i686-linux", "."] => nil ふむふむ ・・で。 irb(main):005:0> p $: ["/usr/local/lib/ruby/site_ruby/1.8", "/usr/local/lib/ruby/site_ruby/1.8/i686-linux", "/usr/local/lib/ruby/site_ruby", "/usr/local/lib/ruby/vendor_ruby/1.8", "/usr/local/lib/ruby/vendor_ruby/1.8/i686-linux", "/usr/local/lib/ruby/vendor_ruby", "/usr/local/lib/ruby/1.8", "/usr/local/lib/ruby/1.8/i686-linux", "."] => nil
あ、本当ですね。
ていうか、こんなにライブラリを探しまくるんですか。 知りませんでした。
次に、__FILE__って何なの?
いやー これ結構目にしてたのに、なんとなくでつかってましたわー
シンプルに言うと、自分のファイル名を返す
面白かったのは、ユーザのいるカレントディレクトリからのディレクトリパスも含めて返すところ。
たとえば以下のプログラムを書いたとして、別のディレクトリから実行すると分かる。
$ cd ~/dev/ $ vi test.rb
p __file__
$ ruby test.rb "test.rb" ←今いるディレクトリなのでファイル名だけ $ cd .. $ ruby dev/test.rb "dev/test.rb" ←ディレクトリパスも含まれる
へ~~ って感じ
ちゃんと頭でわかると快感ですね
File.dirname(filename)の使い方?
まぁこれもリファレンスとかですぐに分かるんですが、
filenameの一番右側にあるスラッシュより・・・
ていうか、ディレクトリパスですね。
filenameに/がなく、普通のファイルタイトルだけだった場合は “.” が返るそうですね。
というわけで、上の__FILE__と併用するとこうなりますね。
p File.dirname(__FILE__)
$ ruby test.rb "." $ cd .. $ ruby dev/test.rb "dev"
へへへへー って感じですね。
ファイルのある場所をロードパスに加える
つまり、上のLOAD_PATHの話と組み合わせると。。 こうだ。
$: << File.dirname(__FILE__)
意味は、「こやつのファイルがあるディレクトリもロードパスに加えてやってーな」
へ~~
へ~~
汎用的に使えるといえば、まぁ確かに使えそうですね。
ディレクトリごと自分の入れたライブラリとセットで移動させても問題なさげです。
けど、あまーり見ないんですが、本当にこうやるのは主流なのでしょうか・・・
おわり