2012-04-05 36 views
0

編輯:紅寶石OptionParser空開關「 - 」行爲

我已經寫了使用OptionParser優雅地處理命令行輸入代碼。我面臨着兩個主要命中。

  1. 傳遞空開關' - '不會給出錯誤。當然有些程序認爲這是有效的,但我不應該這樣做。
  2. 該程序需要兩個強制開關,但它可以接受一個開關而不抱怨!例如program.ruby -f foo -b bar是有效的輸入,兩個開關都是:REQUIRED。但是隻提供一個交換機沒有問題,這不是所期望的行爲。

對於我做這個第一種情況:

opts.on('-', /\A-\Z/) do 
    $stderr.print "Invalid empty switch" 
    exit 1 
end 

它工作正常。但是,這是否是正確的做法?

對於第二種情況,我查找了OptionParser.new塊中的解決方案,但找不到一個解決方案。例如

unless options.foo && options.bar 
    puts "Error." 
    exit 2 
end 

在OptionParser.new塊之外做它是正常的方式嗎?

+0

好的,我會在這裏進行更正,因爲我正試圖解決這個問題。爲了讓空開關正常工作,我使用了'opts.on(' - ',/ \ A- \ Z /)',它只有在遇到正則表達式後才進入塊。 – ismail 2012-04-06 00:27:58

+0

這是,我不知道那是怎麼發生的,因爲我在探究問題並不斷完善解決方案時進行了編輯。如何讓主持人重定向/刪除這個? – ismail 2012-04-06 05:32:11

+0

由於另一個沒有答案,所以您可能希望刪除那一個。或者,點擊問題下面的「標誌」鏈接(並在這些評論上方)並相應地繼續。 – 2012-04-06 06:02:57

回答

1

如果您使用的是OptionParser,那麼是的,您需要明確禁止空開關並手動檢查所需的參數。但是,如果您使用其他工具進行選項分析,例如defunkt's gem choice,則可以根據需要標記選項,而無效選項(如空開關)會導致打印幫助和退出應用程序。我知道在某些情況下使用OptionParser更有意義,但我個人更喜歡使用the more convenient tools out there

儘管所需的選項非常簡單,但我建議您通過以下方式來考慮您的API決策。你知道有多少個命令行工具需要選項?命令行通常分爲選項和參數是有原因的,前者通常是可選的,後者通常是必需的。我會堅持這個既定的慣例。

0

我想索爾(https://github.com/wycats/thor)可以更有效地解決你的問題。

+0

+1號 - 它的建造非常好。 – joelparkerhenderson 2012-04-06 05:55:52

+0

如果通過非常好的構建你的意思是慢,那麼肯定,它的建設非常好。 – 2015-05-11 20:57:08