Class: BinData::Virtual
Overview
A virtual field is one that is neither read, written nor occupies space. It is used to make assertions or as a convenient label for determining offsets.
require 'bindata'
class A < BinData::Record
string :a, :read_length => 5
string :b, :read_length => 5
virtual :c, :assert => lambda { a == b }
end
obj = A.read("abcdeabcde")
obj.a #=> "abcde"
obj.c.offset #=> 10
obj = A.read("abcdeABCDE") #=> BinData::ValidityError: assertion failed for obj.c
Parameters
Parameters may be provided at initialisation to control the behaviour of an object. These params include those for BinData::Base as well as:
:assert
-
Raise an error when reading or assigning if the value of this evaluated parameter is false.
Instance Attribute Summary
Attributes inherited from Base
Instance Method Summary collapse
- #assert! ⇒ Object
- #assign(val) ⇒ Object
- #clear? ⇒ Boolean
- #do_num_bytes ⇒ Object
- #do_read(io) ⇒ Object
- #do_write(io) ⇒ Object
- #snapshot ⇒ Object
Methods inherited from Base
#==, #=~, arg_extractor, bindata_name, #clear, #debug_name, #eval_parameter, #get_parameter, #has_parameter?, #initialize_instance, #initialize_with_warning, #inspect, #lazy_evaluator, #new, #num_bytes, #offset, #pretty_print, #read, read, register_subclasses, #rel_offset, #safe_respond_to?, #to_binary_s, #to_s, unregister_self, #write
Methods included from AcceptedParametersPlugin
#accepted_parameters, #default_parameters, #mandatory_parameters, #mutually_exclusive_parameters, #optional_parameters
Methods included from RegisterNamePlugin
included, #initialize_shared_instance
Methods included from CheckOrAdjustOffsetPlugin
included, #initialize_shared_instance
Methods included from Framework
#debug_name_of, included, #offset_of
Instance Method Details
#assert! ⇒ Object
47 48 49 50 51 |
# File 'lib/bindata/virtual.rb', line 47 def assert! if has_parameter?(:assert) and not eval_parameter(:assert) raise ValidityError, "assertion failed for #{debug_name}" end end |
#assign(val) ⇒ Object
39 40 41 |
# File 'lib/bindata/virtual.rb', line 39 def assign(val) assert! end |
#clear? ⇒ Boolean
34 |
# File 'lib/bindata/virtual.rb', line 34 def clear?; true; end |
#do_num_bytes ⇒ Object
36 |
# File 'lib/bindata/virtual.rb', line 36 def do_num_bytes; 0; end |
#do_read(io) ⇒ Object
43 44 45 |
# File 'lib/bindata/virtual.rb', line 43 def do_read(io) assert! end |
#do_write(io) ⇒ Object
37 |
# File 'lib/bindata/virtual.rb', line 37 def do_write(io); end |
#snapshot ⇒ Object
35 |
# File 'lib/bindata/virtual.rb', line 35 def snapshot; nil; end |