2012-02-10 67 views
4

我想知道如何將一個false值傳遞給我的ruby腳本。在ruby中傳遞布爾參數

如果我調用:

ruby myscript.rb false 

,然後在我的劇本,如果我說:

my_class.new(*ARGV) 
or my_class.new(ARGV[0]) 

基本上是用的 「假」 被傳遞的字符串。顯然,如果我說

if(ARGV[0]){ do something} .. this gets executed even if value passed is false. 

我可以改變我的函數簽名自動隱蔽參數設置爲布爾..所以說我沒有做

if(ARGV[0]=='true') 
+0

你如何期待你的函數能夠解釋像''foo'這樣的非布爾字符串? – 2012-02-10 21:26:06

+0

'foo'顯然是真的。 – 2012-02-10 21:31:00

回答

8

你需要評估的命令行參數。在命令行上傳遞的任何東西都是一個字符串,這就是命令行所知道的。

例如,你可以猴子補丁字符串(未經測試):

class String 
    def to_b 
    self =~ /^(true|t|yes|y|1)$/i 
    end 
end 

或者寫一個程序,或者使用命令行選項解析器(長期最好的選擇),或者......

+1

你的正則表達式匹配'不真實':)〜!所以我建議在前面添加'^':'/ ^(true | t | yes | y | 1)$/i' – 2012-08-13 16:57:52

1

您不能從命令行傳遞對象。只有你可以傳遞的對象是一個String。我想在你的程序某些時候你必須做的:

if(ARGV[0]=='true') 
2

或者,如果你想要做更復雜的命令行與選項開關,包括布爾類型的解析,看看Ruby的內置OptionParser

3
def to_b(string) 
    case string 
    when /^(true|t|yes|y|1)$/i then true 
    when /^(false|f|no|n|0)$/i then false 
    else raise "Cannot convert to boolean: #{string}" 
    end 
end 

這是基於Dave Newton's answer有兩點不同:

  1. 更多對稱性 - 如果你有明確的對「真」的測試試驗,我想你也應該是對稱的「錯誤'測試。

  2. 只要對/(monkey|duck) p(at|un)ching)/說不,如String這樣的關鍵類!