2012-04-25 198 views
40

如何從命令行直接調用ruby函數?從命令行調用ruby函數

想象一下,我想有此腳本test.rb

class TestClass 
    def self.test_function(some_var) 
     puts "I got the following variable: #{some_var}" 
    end 
end 

如果這個腳本在命令行(ruby test.rb)運行,沒有任何反應(如預期)。

有沒有類似ruby test.rb TestClass.test_function('someTextString')?我想獲得以下輸出:I got the following variable: someTextString

回答

74

首先,該類的名稱需要以大寫字母開頭,並且由於您確實想使用靜態方法,函數名稱定義需要以self.開頭。

class TestClass 
    def self.test_function(someVar) 
     puts "I got the following variable: " + someVar 
    end 
end 

然後調用該命令行,你可以這樣做:

ruby -r "./test.rb" -e "TestClass.test_function 'hi'" 

如果不是有test_function作爲實例方法,你必須:

class TestClass 
    def test_function(someVar) 
     puts "I got the following variable: " + someVar 
    end 
end 

那麼你'd援引它:

ruby -r "./test.rb" -e "TestClass.new.test_function 'hi'" 
+9

+1 :)。也。用於方法和變量名稱的CamelCase是非Ruby風格的。使用undersore:'test_function','some_var' – fl00r 2012-04-25 13:32:14

+0

@ fl00r好點!我更新了答案。 – Candide 2012-05-02 17:15:22

+0

查看[回覆人:@lunero](http://stackoverflow.com/a/37948278/1245614)多個參數 – skitheo 2016-12-14 21:03:05

2

如果你正在使用命令行界面,那麼我建議看看thor

Thor將您的命令直接映射到定義的類中的方法,有關示例,請參見thor wiki

11

這裏有另一種變化,如果你發現在命令行鍵入ruby語法很尷尬,你真的只想把args傳遞給ruby。這裏的test.rb:

#!/usr/bin/env ruby 

class TestClass 
    def self.test_function(some_var) 
    puts "I got the following variable: #{some_var}" 
    end 
end 

TestClass.test_function(ARGV[0]) 

讓test.rb可執行文件並運行它像這樣:

./test.rb "Some Value" 

或者這樣運行:

ruby test.rb "Some Value" 

這工作,因爲紅寶石自動設置ARGV數組添加到傳遞給腳本的參數。您可以使用ARGV[0]ARGV.first來獲取第一個參數,或者您可以使用ARGV.join(' ')將參數組合爲一個由空格分隔的字符串。

如果你在做大量的命令行工作,你最終可能會使用Shellwords,它在標準的ruby庫中。

+1

通常你會將頂級代碼包裝到'if __FILE__ == $ 0'中。 – 2012-04-25 18:05:38

3
#!/usr/bin/env ruby 

class A 
    def run 
    p :Hello_world 
    end 
    self 
end.new.run 

的常用方法腳本Ruby是隻使用名爲主要的頂級執行環境您可以直接開始定義您在類之外編寫的方法和代碼,這些將直接執行。 (順便說一下,類內的代碼,但任何方法之外的代碼也會「自行」運行。)

不管怎麼說,我和你在一起......我喜歡寫所有的代碼在一個名爲類實例化類,所以你可以結合技術..有類回自己的對象..然後只使用一點點的頂級代碼分配,初始化,然後點到類中。

有了這個,你可以只輸入$ ruby test.rb,它會做你想要什麼。或者你可以chmod +x test.rb; ./test.rb因爲我們做add a shebang.

0

只是Ingenu的答案的擴展,該函數不打印出來,但返回的東西。

我們將有以下test.rb

class TestClass 
    def self.test_function(some_var) 
     return "I got the following variable: " + some_var 
    end 
end 

然後調用該命令行,並獲得返回值:

ruby -r "./test.rb" -e "puts TestClass.test_function('hi')" 
2

如果你有多個參數來調用一個這樣的例子:

class TestClass 
    def self.test_function(some_var1, some_var2) 
    puts "I got the following variables: #{some_var1}, #{some_var2}" 
    end 
end 

運行它像硫S(參數必須是逗號在這種情況下分開)

ruby -r "./test.rb" -e "TestClass.new.test_function 'hi','Mike'" 
+0

這很好,因爲最初的答案不包括2個參數。 – camdixon 2017-02-16 20:42:26

0

如果你知道如何從命令行

叫RB文件,這可以爲你做的全部伎倆。

你所做的是,只是在課堂上定義你的方法。現在你可以在定義下面調用它。如果你仍然想閱讀,睜大你的眼睛

class TestClass 
    def self.test_function(some_var) 
    puts "I got the following variable: #{some_var}" 
    end 
    test_function(var) 
end