2012-02-10 115 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这样的关键类!