2016-09-21 62 views
1

我正在用ruby編寫不同選項的腳本,我無法理解OptionParser如何幫助我。帶有感嘆號的紅寶石示例

特別是,有在文檔中的例子:https://docs.ruby-lang.org/en/2.1.0/OptionParser.html

require 'optparse' 

options = {} 
OptionParser.new do |opts| 
    opts.banner = "Usage: example.rb [options]" 

    opts.on("-v", "--[no-]verbose", "Run verbosely") do |v| 
    options[:verbose] = v 
    end 
end.parse! 

p options 
p ARGV 

我能理解的「end.parse」行感嘆號(但我希望以後的參數),但我發現以下2行混淆,p尚未聲明,我不明白它是否是示例源的一部分。

我該如何使用'-v'選項?我只是檢查選項[:v]是否爲niltrue

最後一件事,其他選項會發生什麼? OptionParser只解析開關嗎?如果我在'-v'之後還有其他參數會怎麼樣?像myscript -v duck ketchup banana

+0

'p' [在'Kernel'中定義](http://ruby-doc.org/core-2.3.1/Kernel.html#method-ip),所以它幾乎總是在Ruby中可用。 'p obj'等同於'puts obj.inspect'。 – GolfWolf

回答

3

回答您的問題:

我能理解的「end.parse」行感嘆號(但我希望以後參數)

The documentation指出parse!需要一個可選argv參數。如果未提供,則默認爲default_argv,我想是包含在命令行中傳遞給此腳本的參數的字符串。

p由於未聲明的,如果它的示例源

pdefined in Kernel的一部分,我無法理解,所以它是(幾乎)總是可以在Ruby中。 p obj相當於puts obj.inspect

在這種情況下,p僅用於說明解析參數後,options散列包含您在OptionParser塊中定義的所有標記/選項。

我該如何使用'-v'選項?我只是檢查選項[:v]是否爲零或真?

是的,但這實際上是options[:verbose]

最後一件事,其他選項會發生什麼? OptionParser只解析開關嗎?如果我在'-v'之後還有其他參數會怎麼樣?像myscript -v duck ketchup banana

你將不得不多次調用opts.on匹配所有其它交換機/參數你有興趣,請查看文檔here關於如何做到這一點的解釋。

+1

確切地說,'p'在所有類的實例中都可用,明確包括'Kernel'和/或派生自'Object',包括'main'。它不在類的實例中定義,直接從'BasicObject'派生而不包括'Kernel'(通常這發生在DSL上)。BTW,用於優化格式。 – mudasobwa