読者です 読者をやめる 読者になる 読者になる

@Konboi memo

主に技術に関してつらつらと。

$0 と __FILE__ の違いについて調べてみた。

gemとかの require されるファイル側でどこから呼ばれてるのか知りたかったので調べてみた。

caller メソッドとかで特定もできなくはなさそうだったけど、 $0 のほうが一般的っぽかった。

$0 とよくgemとかで見かける __FILE__って何が違うのか調べてみた。

ざっくり言うと

  • $0 は実行されているファイル自身
  • __FILE____FILE__が記述されているファイル自身

たぶん意味がよくわからないと思うので検証に使ったファイルが下記。

# yobu.rb

require './yobareru'
require './dir/yobareru2'

class Yobu
  include Yobareru
  include Yobareru2

  def oi
    puts 'oi'
    hello
    hello2
  end
end

Yobu.new.oi
# yobareru.rb

module Yobareru
  def hello
    puts 'hello'
    puts "FILE: #{__FILE__}"
    puts File.dirname(__FILE__)

    puts "$0: #{$0}"
    puts File.dirname($0)
  end

  module_function :hello
end
# dir/yobareru2.rb

module Yobareru2
  def hello2
    puts 'hello'
    puts "FILE: #{__FILE__}"
    puts File.dirname(__FILE__)

    puts "$0: #{$0}"
    puts File.dirname($0)

  end

  module_function :hello2
end

実行結果が下記

# $ ruby yobu.rb

oi
hello
FILE: /home/vagrant/workspace/ruby/junk/yobareru.rb
/home/vagrant/workspace/ruby/junk
$0: yobu.rb
.
hello
FILE: /home/vagrant/workspace/ruby/junk/dir/yobareru2.rb
/home/vagrant/workspace/ruby/junk/dir
$0: yobu.rb
.

まとめ

$0__FILE__ の違いわかってよかった。