Parent

Class/Module Index [+]

Quicksearch

ClsRuby::TagScalarVector

Класс тега для парсинга последовательностей скалярных значений с возможными ограничениями на каждое из них.

Конструктор поддерживает следующие дополнительные ключи в хэше params:

:format

объект, реализующий интерфейс ScalarFormat. Этот объект будет использован для для преобразования токенов входного потока в значения нужного пользователю типа.

:constraint

объект, реализующий интерфейс ScalarChecker. Этот объект, если он задан, будет использован для проверки извлекаемых из входного потока значений.

:can_be_empty

true, если разрешается пустая последовательность (по умолчанию в последовательности должен быть хотя бы один элемент).

:value

значение тега. Если этот параметр указан, то тег сразу объявляется определенным. Ожидается, что значением будет Array. Корректность значения не проверятся.

Пример использования:

Пусть необходимо парсить следующую структуру:
{params
  {init_bytes <uint:0..255>*}
  {shutdown_bytes <uint:0..255>*}
  {devices <str>+}
}
Например:
{params
  {init_bytes 0 0 254 254 0 0}
  {shutdown_bytes 0xff 0xff 0xff}
  {devices "com1" "com2" "com3" }
}

Для этого можно применить тег:
class TagParams < ClsRuby::Tag
  child_tag :init_bytes, ClsRuby::TagScalarVector,
                :format => ClsRuby::SCALAR_UINT,
                :constraint => 0..255,
                :can_be_empty => true
  child_tag :shutdown_bytes, ClsRuby::TagScalarVector,
                :format => ClsRuby::SCALAR_UINT,
                :constraint => 0..255,
                :can_be_empty => true
  child_tag :devices, ClsRuby::TagScalarVector,
                :format => ClsRuby::SCALAR_STRING,
                :mandatory => true
end

Для извлечения значения следует воспользоваться методом TagScalarVector#value. Но, если тег не был определен, то TagScalarVector#value возвратит значение []. Для упрощения работы с необязательными тегами можно воспользоваться методом fetch:

tag = ClsRuby::TagScalarVector.new( :name => 'init_bytes',
    :format => ClsRuby::SCALAR_UINT,
    :constraint => 0..255 )
...
bytes = tag.fetch( [ 0, 0, 0 ] )

Attributes

value[R]

Чтение разобранного тегом значения. Возвращается пустой вектор, если ни одно значение не было разобрано.

Public Class Methods

new( params = {} ) click to toggle source

Конструктор порождает исключение FormatUndefinedEx, если в params нет ключа :format, или если этому ключу соответствует nil.

# File lib/cls-ruby/tag_scalar_vector.rb, line 80
def initialize( params = {} )
  super( params )

  tag_scalar_extract_params( tag_params )
  @can_be_empty = tag_params.fetch( :can_be_empty, false )
  @value = []

  v = tag_params.fetch( :value, nil )
  send( :value=, v ) if v
end

Public Instance Methods

fetch( default ) click to toggle source

Вспомогательный метод для извлечения значения из необязательного тега.

Если тег не определен, то возвращает значение default.

# File lib/cls-ruby/tag_scalar_vector.rb, line 107
def fetch( default )
  tag_defined? ? value : default
end
tag_on_finish() click to toggle source

Порождает исключение ValueMissedEx, если к моменту закрытия тега значение не было определено.

# File lib/cls-ruby/tag_scalar_vector.rb, line 126
def tag_on_finish
  raise ValueMissedEx.new(
      "value missed for tag '#{tag_name}'" )          if !@can_be_empty && 0 == @value.size

  super
end
tag_on_format( formatter ) click to toggle source
# File lib/cls-ruby/tag_scalar_vector.rb, line 142
def tag_on_format( formatter )
  @value.each do |v| formatter.value( @format.format( v ) ) end
end
tag_on_start( name ) click to toggle source

Порождает исключение TagAlreadyDefinedEx, если тег уже определен.

# File lib/cls-ruby/tag_scalar_vector.rb, line 117
def tag_on_start( name )
  super( name )

  raise TagAlreadyDefinedEx.new( "tag '#{tag_name}' already defined" ) if
      tag_defined?
end
tag_on_tok_nonspace( token ) click to toggle source
# File lib/cls-ruby/tag_scalar_vector.rb, line 134
def tag_on_tok_nonspace( token )
  @value << tag_scalar_check( token, @format.on_tok_nonspace( token ) )
end
tag_on_tok_string( token ) click to toggle source
# File lib/cls-ruby/tag_scalar_vector.rb, line 138
def tag_on_tok_string( token )
  @value << tag_scalar_check( token, @format.on_tok_string( token ) )
end
tag_reset() click to toggle source
# File lib/cls-ruby/tag_scalar_vector.rb, line 111
def tag_reset
  @value = []
  super
end
value=( values ) click to toggle source

Делает тег определенным с заданными значениями.

Старые значения выбрасываются.

+Примечание+. Значения на корректность не проверяется.

values

вектор значений для тега.

# File lib/cls-ruby/tag_scalar_vector.rb, line 98
def value=( values )
  @value = values
  tag_make_defined
  self
end

[Validate]

Generated with the Darkfish Rdoc Generator 2.