class BinData::Record
obj.s.field_names =># [“x”, “y”, “z”]
obj.field_names =># [“b”, “s”]
obj = SomeDataType.new
end
end
int8 :z
int8 :y
int8 :x
struct :s do
int16le :b
int32le :a
hide :a
class SomeDataType < BinData::Record
require ‘bindata’
A Record is a declarative wrapper around Struct.
def arg_extractor
def arg_extractor RecordArgExtractor end
def define_field_accessors(fields) #:nodoc:
Removing this method will not have any effect on correctness.
Struct#method_missing. This is purely a speed optimisation.
Defines accessor methods to avoid the overhead of going through
def define_field_accessors(fields) #:nodoc: unless method_defined?(:bindata_defined_accessors_for_fields?) fields.each_with_index do |field, i| name = field.name_as_sym if name define_field_accessors_for(name, i) end end define_method(:bindata_defined_accessors_for_fields?) { true } end end
def define_field_accessors_for(name, index)
def define_field_accessors_for(name, index) define_method(name) do instantiate_obj_at(index) unless @field_objs[index] @field_objs[index] end define_method(name.to_s + "=") do |*vals| instantiate_obj_at(index) unless @field_objs[index] @field_objs[index].assign(*vals) end end
def sanitize_parameters!(params) #:nodoc:
def sanitize_parameters!(params) #:nodoc: params.merge!(dsl_params) super(params) define_field_accessors(params[:fields].fields) end