blob: 718553e83541a8f5b413d1311ea500a3d825ff6d (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
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
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
|
##
# Array
#
# ISO 15.2.12
class Array
##
# Calls the given block for each element of +self+
# and pass the respective element.
#
# ISO 15.2.12.5.10
def each(&block)
return to_enum :each unless block_given?
idx, length = -1, self.length-1
while idx < length and length <= self.length and length = self.length-1
elm = self[idx += 1]
unless elm
if elm == nil and length >= self.length
break
end
end
block.call(elm)
end
self
end
##
# Calls the given block for each element of +self+
# and pass the index of the respective element.
#
# ISO 15.2.12.5.11
def each_index(&block)
return to_enum :each_index unless block_given?
idx = 0
while(idx < length)
block.call(idx)
idx += 1
end
self
end
##
# Calls the given block for each element of +self+
# and pass the respective element. Each element will
# be replaced by the resulting values.
#
# ISO 15.2.12.5.7
def collect!(&block)
return to_enum :collect! unless block_given?
self.each_index{|idx|
self[idx] = block.call(self[idx])
}
self
end
##
# Alias for collect!
#
# ISO 15.2.12.5.20
alias map! collect!
##
# Private method for Array creation.
#
# ISO 15.2.12.5.15
def initialize(size=0, obj=nil, &block)
raise TypeError, "expected Integer for 1st argument" unless size.kind_of? Integer
raise ArgumentError, "negative array size" if size < 0
self.clear
if size > 0
self[size - 1] = nil # allocate
idx = 0
while(idx < size)
self[idx] = (block)? block.call(idx): obj
idx += 1
end
end
self
end
##
# Private method for Array creation.
#
# ISO 15.2.12.5.31 (x)
def inspect
return "[]" if self.size == 0
"["+self.map{|x|x.inspect}.join(", ")+"]"
end
# ISO 15.2.12.5.32 (x)
alias to_s inspect
##
# Delete element with index +key+
def delete(key, &block)
while i = self.index(key)
self.delete_at(i)
ret = key
end
if ret == nil && block
block.call
else
ret
end
end
# internal method to convert multi-value to single value
def __svalue
case self.size
when 0
return nil
when 1
self[0]
else
self
end
end
end
##
# Array is enumerable
class Array
# ISO 15.2.12.3
include Enumerable
##
# Sort all elements and replace +self+ with these
# elements.
def sort!(&block)
self.replace(self.sort(&block))
end
end
|