Rubyで `if __name__ == '__main __'`と同等


101

Rubyは初めてです。個別に使い続けたいツールを含むモジュールから関数をインポートしようとしています。Pythonではこれを単純に行います:

def a():
    ...
def b():
    ...
if __name__ == '__main__':
    a()
    b()

これにより、プログラムを実行したり、使用するモジュールとしてインポートしa()たり、b()個別にインポートしたりできます。Rubyの同等のパラダイムは何ですか?



回答:


130

私が実際に目にしたRubyから(トンではなく、許可されている)、これは標準のRubyデザインパターンではありません。モジュールとスクリプトは別々にしておくことになっているので、これを行うための本当に良い、きれいな方法がなくても、私は驚かないでしょう。

編集: それを見つけました。

if __FILE__ == $0
    foo()
    bar()
end

しかし、それは間違いなく一般的ではありません。


4
好奇心から、モジュールとスクリプトを分離しておく理由は何ですか?
イマジスト2010

5
Rubyistsが好むのはそれだと思います。モジュール定義はモジュール定義です。そのモジュールでなんらかのアクションを実行したい場合は問題ありませんが、実行しているアクションはモジュール定義ではありません
マッチ

8
ただし、テストには便利です。モジュールテストをそこに配置し、ラッパーなしでモジュールファイルから実行できます。
ebneter 2010

3
@Imagistと@ebneterまたはその逆:スクリプトはコマンドラインから実行することを目的とした単一のモジュールですが、部分的にテストして別のモジュールでテストすることもできます。その場合、NAME == $ 0は非常に貴重です。
混乱

16
私もこれを見たことがありませんが、眉をひそめていません。Rubyの公式ドキュメントはそれを使用します:ruby-lang.org/en/documentation/quickstart/4
cflewis

12

スタックトレースが空の場合、左右に実行を開始できます。Rubyに1週間ほど携わっているので、これが慣習的に使用されているのか、それとも慣習に使用されていないのかはわかりません。

if caller.length == 0
  # do stuff
end

コンセプトの証明:

ファイル:test.rb

#!/usr/bin/ruby                                                                 

if caller.length == 0
  puts "Main script"
end

puts "Test"

ファイル:shmest.rb

#!/usr/bin/ruby -I .                                                            

require 'test.rb'

puts "Shmest"

使用法:

$ ./shmest.rb 
Test
Shmest

$ ./test.rb
Main script
Test

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.