Ruby stdlib 學習 —— OptionParser

來源:互聯網
上載者:User

標籤:log   時間   not   sep   簡單   ima   互動   ati   word   

http://ruby-doc.org/stdlib-2.3.3/libdoc/optparse/rdoc/OptionParser.html#method-c-new   閱讀lib的文檔,做個筆記。OptionParser 這個類用於,在寫一些command line工具的時候,設定命令列參數選項。GetoptLong有類似的功能,不過文中建議使用OptionParser.一、例:簡單樣本 (主要是入個門,順便示範了下不帶參數的選項該怎麼處理,像-v, -f 那種))
 1 #直接存成test.rb, 運行 ruby test.rb -v somethingnouse 能正常運行 2 #運行 ruby test.rb -v somethingnouse -s,因為沒有設定-s的選項處理, 3 #會報錯"invalid option: -s (OptionParser::InvalidOption)" 4 require ‘optparse‘ 5   6 p ARGV # => ["-v", "somethingnouse"] 7 options = {} #自己設定用來接收輸入參數的hash,用數組應該也可以,隨便, 8              #也可以說和OptionParser沒什麼關係 9 OptionParser.new do |opts|10   opts.banner = "Usage: example.rb [options]"11  12   opts.on("-v", "--[no-]verbose", "Run verbosely") do |v| #選項-v後面沒有值,看來有的話會賦值成true13     puts "value of v"#不寫-v選項的話程式根本不到這一行,可以理解成if has "-v" 這種感覺吧14     puts v #=> true15     options[:verbose] = v #這裡寫一些功能上的code16   end17 end.parse! #shift一個參數, Code:a = [1,2,3]; a.shift ##output=> a=[2,3] 應該是類似這種機制吧,細節沒看18  19 p options #{:verbose=>true}20 p ARGV #["somethingnouse"]
View Code 二、例:產生help基本就是邊調試邊注釋來學習的。在文檔裡例子的基礎上改了一些小地方用作調試。
 1 require ‘optparse‘ 2   3 Options = Struct.new(:name) 4   5 class Parser 6   def self.parse(options) 7     args = Options.new("world") #Struct類args的參數name預設值為"world" 8   9     opt_parser = OptionParser.new do |opts| #開始使用OptionParser類處理參數10       opts.banner = "Usage:example.rb [option]" #輸出help時最上面那一行11  12       opts.on("-n NAME", "--name=NAME", "Name to say hello to") do |n|13       #輸入參數選項為-n時,需要帶參數NAME, 用法:ruby test.rb --name="A puppy"14       #例子裡-nNAME之間沒有空格,測了一下參數寫成"-nDog"是好用的。15       #同樣,長參數--name寫成--name NAME,而在調用的時候 ruby test.rb --name="A puppy"也成立,非常靈活16         args.name = n #這裡其實就是把參數值傳到別的地方去,加工,列印,隨你怎麼處理17         puts n       18         puts "#{ARGV}" #可以用例查看一下ARGV的變化,命令為 ruby test.rb -n Dog -h 運行時,這裡輸出["-h"]19                        #和預想的有點出入,有時間可以看看OptionParser的Code深入理解一下20       end21  22       opts.on("-h", "--help", "Prints this help") do23         puts opts #列印所有的opts內容,其實就是我們設定的每項opt.on的加上banner24         #exit #列印完help就退出了,不處理其他參數。注意exit是退出程式25         #比如我在line17 列印了name的值。如果我運行 ruby test.rb -n Dog -h26         #output:27         #Dog28         #Usage:example.rb [option]29         #-n, --name=NAME                  Name to say hello to30         #-h, --help                       Prints this help31         #顯然先處理了 -n 選項,又處理了-h再退出的32  33       end34     end35  36     opt_parser.parse!(options) #!=>shift 繼續處理下一個參數37     return args  #看到這裡就明白,在實際應用中,可以用這個Struct來收集所有傳入的參數值38   end39 end40  41 #options = Parser.parse %w[-h] #%w 用於表示其中元素被引號括起的數組,元素用空格分離。如 %w[a b] => ["a", "b"]42 options = Parser.parse ARGV #直接處理運行命令列傳入的參數43 puts options
View Code   順便搜了一下ruby的選項源碼:就是ruby --help列舉的那些:https://github.com/ruby/ruby/blob/ruby_2_3/ruby.c 好像也沒用什麼庫之類的(主要摟了一眼沒看著include<getopt.h>),應該是直接宏+printf(這幾行code位置line224-237):
 1 #define SHOW(m) show_usage_line((m).str, (m).namelen, (m).secondlen, help) 2 printf("Usage: %s [switches] [--] [programfile] [arguments]\n", name); 3 for (i = 0; i < num; ++i) 4 SHOW(usage_msg[i]); 5 if (!help) return; 6 for (i = 0; i < numberof(help_msg); ++i) 7 SHOW(help_msg[i]); 8 puts("Features:"); 9 for (i = 0; i < numberof(features); ++i)10 SHOW(features[i]);11 }
View Code  用宏定義函數這方面的知識我基本為0。有興趣可以觀摩一下。 三、參數有一些內建類型可以直接拿來用Date – Anything accepted by Date.parseDateTime – Anything accepted by DateTime.parseTime – Anything accepted by Time.httpdate or Time.parseURI – Anything accepted by URI.parseShellwords – Anything accepted by Shellwords.shellwordsString – Any non-empty stringInteger – Any integer. Will convert octal. (e.g. 124, -3, 040)Float – Any float. (e.g. 10, 3.14, -100E+13)Numeric – Any integer, float, or rational (1, 3.4, 1/3)DecimalInteger -- Like Integer, but no octal format.OctalInteger -- Like Integer, but no decimal format.DecimalNumeric -- Decimal integer or float.TrueClass – Accepts ‘+, yes, true, -, no, false’ and defaults as trueFalseClass – Same as TrueClass, but defaults to falseArray – Strings separated by ‘,’ (e.g. 1,2,3)Regexp – Regular expressions. Also includes options. 一個使用time的例子:
 1 require ‘optparse‘ 2 require ‘optparse/time‘ 3   4 OptionParser.new do |parser| 5   #例子比較簡單,重點應該就在第三個參數,輸入之後相關類會自動解析? 6   parser.on("-t", "--time [TIME]", Time, "Begin execution at given time") do |time| 7     p time 8   end 9 end.parse!10 # 比如運行:ruby test.rb  -t 2000-1-111 # output: 2000-01-01 00:00:00 +080012 # time 被自動處理了
View Code 四 op.accept用法。理解上可以用accept關聯任何自訂類型的執行個體,再通過OptionParser和外界互動。文檔裡舉得這個例子,可以聯想到gem install 的用法。比如:gem install libA。gem 要去查詢libA的安裝路徑時,每個lib和安裝路徑就是key和value的關係。如果找不到這個libA,當然也就報錯了。先這麼理解著。還沒注釋,待整理。
 1 require ‘optparse‘ 2   3 User = Struct.new(:id, :name) 4   5 def find_user id 6   not_found = ->{ raise "No User Found for id #{id}" } 7   [ User.new(1, "Sam"), 8     User.new(2, "Gandalf") ].find(not_found) do |u| 9     u.id == id10   end11 end12  13 op = OptionParser.new14   op.accept(User) do |user_id|15     find_user user_id.to_i16   end17   op.on("--user ID", User) do |user|18     puts user19   end20 op.parse!

 

   

Ruby stdlib 學習 —— OptionParser

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.