標籤: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