Rubyでrequire時には処理を実行しない(main関数の定義)

TIPS

こんにちは。ざわかける!のざわ(@zw_kakeru)です。
別ファイルからrequireで関数を呼んだ時にそのファイルの素の実行文が実行されてしまうので、これをmain関数を定義することで解決した時のtipsです。

起こったこと

次のような、Func1とFunc2を定義して処理を実行するrubyスクリプト(File1)を書いていました。

def Func1()
  (略)
end

def Func2()
  (略)
end

puts "hello!"

その後別ファイルであるFile2において、File1で定義した関数を使いたくなったのでrequire_relativeの記述を使って読み込みを行いました。

require_relative './File1'

Func1()
Func2()

すると、require_relativeを使ってFile1を読み込んだ段階でFile1が実行され、素の実行文として記述されていたhellol!の文字列が画面に出力されてしまいました。

やったこと

require句を使ってファイルを読み込んだ際には素の実行文は実行されないようにしたいです。
こちらはpythonでも同様に発生する問題で、pythonではmain関数を定義することによってこれを回避しています。

def main:
  print("hello!")

def func1():
  (略)

def func2():
  (略)


if __name__ == "__main__":
    main()

素の実行文として記述していた処理をmain関数として定義しておいて実行文にif __name__ == “__main__”の条件をつけることでこのmain関数を呼び出す、という書き方をします。
こうすることでこのファイルが別ファイルから呼び出されてた時は処理を実行しないという状態が実現できるんですね。

rubyでも同じことをしましょう。
素の実行文をmain関数に入れて、このmain関数を実行するかどうかの条件文を記述します。

def main()
  puts "hello!"

def Func1()
  (略)
end

def Func2()
  (略)
end

if __FILE__ == $0
  main()
end

rubyの場合だと条件式は上のような記述になりますね。

このように書くことで、他の場所でrequire句を使って読み込んだ時はmainの中身は実行されない、という実装をすることができました。

おわりに

新しく言語を勉強し始めた時、他の言語でできていたことをこの言語ではどう実現するんだろうか、と考えてみるのはなかなか勉強になるものですね。
それぞれの言語の特徴や使い方をより深く理解するきっかけになります。
特に別ファイルからのモジュールインポートは、脱単一ファイルを行うときにどの言語でも必要になる操作なので、これを機会に他の言語でも調べてみたら面白いかもしれません。
以上です。

タイトルとURLをコピーしました