Spec-Zone.ru › Ruby 4.0

Преобразователи аргументов

Для параметра можно указать, что его аргумент следует преобразовать из значения по умолчанию String в экземпляр другого класса.

Содержание

  • Встроенные преобразователи аргументов

    • Date

    • DateTime

    • Time

    • URI

    • Shellwords

    • Integer

    • Float

    • Numeric

    • DecimalInteger

    • OctalInteger

    • DecimalNumeric

    • TrueClass

    • FalseClass

    • Object

    • String

    • Array

    • Regexp

  • Пользовательские преобразователи аргументов

Встроенные преобразователи аргументов

В 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 определяет параметр, аргумент которого преобразуется в объект Array методом Shellwords#shellwords.

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)

Ruby Core © 1993–2025 Yukihiro Matsumoto
Licensed under the Ruby License.
Ruby Standard Library © contributors
Licensed under their own licenses.

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API