2010-02-12 67 views
84

我是Ruby的新手。我正在尋找從包含我想要單獨繼續使用的工具的模塊導入函數。在Python我只想做到這一點:`如果__name__ =='__main __'`等效於Ruby

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

這樣我就可以運行的程序或導入它作爲一個模塊來使用a()和/或b()分開。 Ruby中的等效範例是什麼?

+0

[從命令行運行Ruby庫]的可能重複(http://stackoverflow.com/questions/487086/run-a-ruby-library-from-the-command-line) – 2011-08-17 03:18:17

回答

111

從我在野外見過的Ruby(授予,不是一噸),這不是標準的Ruby設計模式。模塊和腳本應該保持獨立,所以我不會感到驚訝,如果沒有一個很好的,乾淨的方法來做到這一點。

編輯:Found it.

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

但它絕對不是常見。

+4

保留原因的原因是什麼模塊和腳本分開,出於好奇? – Imagist 2010-02-12 02:43:54

+4

我認爲這正是Rubyists喜歡做的。模塊定義是一個模塊定義。如果你想對這個模塊採取一些行動,很好,但是你採取的行動*不是*模塊定義。 – Matchu 2010-02-12 02:48:29

+7

儘管如此,對於測試內容來說非常方便 - 您可以將模塊測試放在那裏,並且只需從模塊文件中運行它們,而無需任何包裝。 – ebneter 2010-02-12 03:11:13

8

如果堆棧跟蹤爲空,我們可以開始執行到左側和右側。我不知道這是常規還是非常規使用,因爲我進入Ruby一週左右。

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