35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
|
# File 'lib/arrayclass.rb', line 35
def self.new(fields)
nclass = Class.new(Array)
nclass.class_eval('def self.add_member(name)
i = @@arr_size
self.class_eval("def #{name}() self[#{i}] end")
self.class_eval("def #{name}=(val) self[#{i}]=val end")
self.class_eval("@@ind[:#{name}] = #{i}")
self.class_eval("@@ind[\"#{name}\"] = #{i}")
self.class_eval("@@attributes << :#{name}")
self.class_eval("@@arr_size = @@attributes.size")
end')
%w(flatten flatten! assoc join rassoc push pop <<).each do |att|
nclass.class_eval("undef_method :#{att}")
end
nclass.class_eval("undef_method :transpose if Array.instance_methods(false).include?('transpose')")
nclass.class_eval("@@ind = {}")
nclass.class_eval("@@attributes = []")
nclass.class_eval("@@arr_size = 0")
fields.each_with_index do |field,i|
nclass.add_member(field.to_s)
end
nclass.class_eval "
def initialize(args=nil)
if args.is_a? Array
super(args)
elsif args.is_a? Hash
super(@@arr_size)
args.each do |k,v|
self[@@ind[k]] = v
end
else
super(@@arr_size)
end
end"
nclass.class_eval('def self.members() @@attributes end')
nclass.class_eval('def members() @@attributes end')
nclass.class_eval("def is_a?(klass)
if klass == Array ; false
else ; super(klass)
end
end
alias_method :kind_of?, :is_a?")
nclass.class_eval('def inspect
bits = @@attributes.map do |v|
val = self.send(v)
val = "nil" if val.nil?
"#{v}=#{val.inspect}"
end
string = bits.join(", ")
"<(Arrayclass based) #{string}>"
end ')
nclass.class_eval('def hash() object_id end')
nclass
end
|