参数转换器¶ ↑
一个选项可以指定其参数从默认的 String
转换为另一个类的实例。
内容¶ ↑
内置参数转换器¶ ↑
OptionParser
有许多内置的参数转换器,下面将演示它们。
Date
¶ ↑
File
date.rb
定义了一个选项,其参数将被转换为 Date
对象。参数通过方法 Date#parse 转换。
require 'optparse/date' parser = OptionParser.new parser.on('--date=DATE', Date) do |value| p [value, value.class] end parser.parse!
执行
$ ruby date.rb --date 2001-02-03 [#<Date: 2001-02-03 ((2451944j,0s,0n),+0s,2299161j)>, Date] $ ruby date.rb --date 20010203 [#<Date: 2001-02-03 ((2451944j,0s,0n),+0s,2299161j)>, Date] $ ruby date.rb --date "3rd Feb 2001" [#<Date: 2001-02-03 ((2451944j,0s,0n),+0s,2299161j)>, Date]
DateTime
¶ ↑
File
datetime.rb
定义了一个选项,其参数将被转换为 DateTime
对象。该参数通过方法 DateTime#parse 进行转换。
require 'optparse/date' parser = OptionParser.new parser.on('--datetime=DATETIME', DateTime) do |value| p [value, value.class] end parser.parse!
执行
$ ruby datetime.rb --datetime 2001-02-03T04:05:06+07:00 [#<DateTime: 2001-02-03T04:05:06+07:00 ((2451943j,75906s,0n),+25200s,2299161j)>, DateTime] $ ruby datetime.rb --datetime 20010203T040506+0700 [#<DateTime: 2001-02-03T04:05:06+07:00 ((2451943j,75906s,0n),+25200s,2299161j)>, DateTime] $ ruby datetime.rb --datetime "3rd Feb 2001 04:05:06 PM" [#<DateTime: 2001-02-03T16:05:06+00:00 ((2451944j,57906s,0n),+0s,2299161j)>, DateTime]
Time
¶ ↑
File
time.rb
定义了一个选项,其参数将被转换为 Time
对象。该参数通过方法 Time#httpdate 或 Time#parse 进行转换。
require 'optparse/time' parser = OptionParser.new parser.on('--time=TIME', Time) do |value| p [value, value.class] end parser.parse!
执行
$ ruby time.rb --time "Thu, 06 Oct 2011 02:26:12 GMT" [2011-10-06 02:26:12 UTC, Time] $ ruby time.rb --time 2010-10-31 [2010-10-31 00:00:00 -0500, Time]
URI
¶ ↑
File
uri.rb
定义了一个选项,其参数将被转换为 URI
对象。该参数通过方法 URI#parse 进行转换。
require 'optparse/uri' parser = OptionParser.new parser.on('--uri=URI', URI) do |value| p [value, value.class] end parser.parse!
执行
$ ruby uri.rb --uri https://github.com [#<URI::HTTPS https://github.com>, URI::HTTPS] $ ruby uri.rb --uri http://github.com [#<URI::HTTP http://github.com>, URI::HTTP] $ ruby uri.rb --uri file://~/var [#<URI::File file://~/var>, URI::File]
Shellwords
¶ ↑
File
shellwords.rb
定义了一个选项,其参数将通过方法 Shellwords#shellwords 转换为 Array
对象。
require 'optparse/shellwords' parser = OptionParser.new parser.on('--shellwords=SHELLWORDS', Shellwords) do |value| p [value, value.class] end parser.parse!
执行
$ ruby shellwords.rb --shellwords "ruby my_prog.rb | less" [["ruby", "my_prog.rb", "|", "less"], Array] $ ruby shellwords.rb --shellwords "here are 'two words'" [["here", "are", "two words"], Array]
Integer
¶ ↑
File
integer.rb
定义了一个选项,其参数将被转换为 Integer
对象。该参数通过方法 Kernel#Integer
进行转换。
require 'optparse' parser = OptionParser.new parser.on('--integer=INTEGER', Integer) do |value| p [value, value.class] end parser.parse!
执行
$ ruby integer.rb --integer 100 [100, Integer] $ ruby integer.rb --integer -100 [-100, Integer] $ ruby integer.rb --integer 0100 [64, Integer] $ ruby integer.rb --integer 0x100 [256, Integer] $ ruby integer.rb --integer 0b100 [4, Integer]
Float
¶ ↑
File
float.rb
定义了一个选项,其参数将被转换为 Float
对象。该参数通过方法 Kernel#Float
进行转换。
require 'optparse' parser = OptionParser.new parser.on('--float=FLOAT', Float) do |value| p [value, value.class] end parser.parse!
执行
$ ruby float.rb --float 1 [1.0, Float] $ ruby float.rb --float 3.14159 [3.14159, Float] $ ruby float.rb --float 1.234E2 [123.4, Float] $ ruby float.rb --float 1.234E-2 [0.01234, Float]
Numeric
¶ ↑
File
numeric.rb
定义了一个选项,其参数将被转换为 Rational
、Float
或 Integer
的实例。该参数通过方法 Kernel#Rational
、Kernel#Float
或 Kernel#Integer
进行转换。
require 'optparse' parser = OptionParser.new parser.on('--numeric=NUMERIC', Numeric) do |value| p [value, value.class] end parser.parse!
执行
$ ruby numeric.rb --numeric 1/3 [(1/3), Rational] $ ruby numeric.rb --numeric 3.333E-1 [0.3333, Float] $ ruby numeric.rb --numeric 3 [3, Integer]
DecimalInteger
¶ ↑
File
decimal_integer.rb
定义了一个选项,其参数将被转换为 Integer
对象。该参数通过方法 Kernel#Integer
进行转换。
require 'optparse' include OptionParser::Acceptables parser = OptionParser.new parser.on('--decimal_integer=DECIMAL_INTEGER', DecimalInteger) do |value| p [value, value.class] end parser.parse!
参数不能以二进制或十六进制格式表示;忽略前导零(不解析为八进制)。
执行
$ ruby decimal_integer.rb --decimal_integer 100 [100, Integer] $ ruby decimal_integer.rb --decimal_integer -100 [-100, Integer] $ ruby decimal_integer.rb --decimal_integer 0100 [100, Integer] $ ruby decimal_integer.rb --decimal_integer -0100 [-100, Integer]
OctalInteger
¶ ↑
File
octal_integer.rb
定义了一个选项,其参数将被转换为 Integer
对象。参数通过方法 Kernel#Integer
进行转换。
require 'optparse' include OptionParser::Acceptables parser = OptionParser.new parser.on('--octal_integer=OCTAL_INTEGER', OctalInteger) do |value| p [value, value.class] end parser.parse!
参数不能以二进制或十六进制格式表示;无论参数是否有前导零,它都将被解析为八进制。
执行
$ ruby octal_integer.rb --octal_integer 100 [64, Integer] $ ruby octal_integer.rb --octal_integer -100 [-64, Integer] $ ruby octal_integer.rb --octal_integer 0100 [64, Integer]
DecimalNumeric
¶ ↑
File
decimal_numeric.rb
定义了一个选项,其参数将被转换为 Integer
对象。参数通过方法 Kernel#Integer
进行转换。
require 'optparse' include OptionParser::Acceptables parser = OptionParser.new parser.on('--decimal_numeric=DECIMAL_NUMERIC', DecimalNumeric) do |value| p [value, value.class] end parser.parse!
参数不能以二进制或十六进制格式表示;前导零会导致参数被解析为八进制。
执行
$ ruby decimal_numeric.rb --decimal_numeric 100 [100, Integer] $ ruby decimal_numeric.rb --decimal_numeric -100 [-100, Integer] $ ruby decimal_numeric.rb --decimal_numeric 0100 [64, Integer]
TrueClass
¶ ↑
File
true_class.rb
定义了一个选项,其参数将被转换为 true
或 false
。参数通过方法 Object#nil?
进行评估。
require 'optparse' parser = OptionParser.new parser.on('--true_class=TRUE_CLASS', TrueClass) do |value| p [value, value.class] end parser.parse!
参数可以是下面示例中显示的任何值。
执行
$ ruby true_class.rb --true_class true [true, TrueClass] $ ruby true_class.rb --true_class yes [true, TrueClass] $ ruby true_class.rb --true_class + [true, TrueClass] $ ruby true_class.rb --true_class false [false, FalseClass] $ ruby true_class.rb --true_class no [false, FalseClass] $ ruby true_class.rb --true_class - [false, FalseClass] $ ruby true_class.rb --true_class nil [false, FalseClass]
FalseClass
¶ ↑
File
false_class.rb
定义了一个选项,其参数将被转换为 true
或 false
。参数通过方法 Object#nil?
进行评估。
require 'optparse' parser = OptionParser.new parser.on('--false_class=FALSE_CLASS', FalseClass) do |value| p [value, value.class] end parser.parse!
参数可以是下面示例中显示的任何值。
执行
$ ruby false_class.rb --false_class false [false, FalseClass] $ ruby false_class.rb --false_class no [false, FalseClass] $ ruby false_class.rb --false_class - [false, FalseClass] $ ruby false_class.rb --false_class nil [false, FalseClass] $ ruby false_class.rb --false_class true [true, TrueClass] $ ruby false_class.rb --false_class yes [true, TrueClass] $ ruby false_class.rb --false_class + [true, TrueClass]
Object
¶ ↑
File
object.rb
定义了一个选项,其参数不应从 String
转换。
require 'optparse' parser = OptionParser.new parser.on('--object=OBJECT', Object) do |value| p [value, value.class] end parser.parse!
执行
$ ruby object.rb --object foo ["foo", String] $ ruby object.rb --object nil ["nil", String]
String
¶ ↑
File
string.rb
定义了一个选项,其参数不应从 String
转换。
require 'optparse' parser = OptionParser.new parser.on('--string=STRING', String) do |value| p [value, value.class] end parser.parse!
执行
$ ruby string.rb --string foo ["foo", String] $ ruby string.rb --string nil ["nil", String]
Array
¶ ↑
File
array.rb
定义了一个选项,其参数将从 String
转换为字符串数组,基于逗号分隔的子字符串。
require 'optparse' parser = OptionParser.new parser.on('--array=ARRAY', Array) do |value| p [value, value.class] end parser.parse!
执行
$ ruby array.rb --array "" [[], Array] $ ruby array.rb --array foo,bar,baz [["foo", "bar", "baz"], Array] $ ruby array.rb --array "foo, bar, baz" [["foo", " bar", " baz"], Array]
Regexp
¶ ↑
File
regexp.rb
定义了一个选项,其参数将被转换为 Regexp
对象。
require 'optparse' parser = OptionParser.new parser.on('--regexp=REGEXP', Regexp) do |value| p [value, value.class] end parser.parse!
执行
$ ruby regexp.rb --regexp foo
自定义参数转换器¶ ↑
您可以创建自定义参数转换器。要创建自定义转换器,请使用 OptionParser#accept 调用以下内容:
-
一个标识符,可以是任何对象。
-
一个可选的匹配模式,默认值为
/.*/m
。 -
一个接受参数并返回转换后的值的代码块。
此自定义转换器接受任何参数,并尽可能将其转换为 Complex
对象。
require 'optparse/date' parser = OptionParser.new parser.accept(Complex) do |value| value.to_c end parser.on('--complex COMPLEX', Complex) do |value| p [value, value.class] end parser.parse!
执行
$ ruby custom_converter.rb --complex 0 [(0+0i), Complex] $ ruby custom_converter.rb --complex 1 [(1+0i), Complex] $ ruby custom_converter.rb --complex 1+2i [(1+2i), Complex] $ ruby custom_converter.rb --complex 0.3-0.5i [(0.3-0.5i), Complex]
此自定义转换器接受任何一个单词的论据,并尽可能将其大写。
require 'optparse/date' parser = OptionParser.new parser.accept(:capitalize, /\w*/) do |value| value.capitalize end parser.on('--capitalize XXX', :capitalize) do |value| p [value, value.class] end parser.parse!
执行
$ ruby match_converter.rb --capitalize foo ["Foo", String] $ ruby match_converter.rb --capitalize "foo bar" match_converter.rb:9:in `<main>': invalid argument: --capitalize foo bar (OptionParser::InvalidArgument)