Files
mruby-mruby/mrblib/array.rb
T
Yukihiro "Matz" Matsumoto ec67fd9587 mruby-compiler: implement array pattern matching
add support for array destructuring patterns in case/in expressions:
- [a, b, c] - fixed length match
- [first, *rest] - head + rest
- [*init, last] - init + tail
- [first, *middle, last] - head + middle + tail
- [1, x, 3] - mixed value and variable patterns
- [first, *, last] - anonymous rest (discarded)

implementation includes:
- grammar rules for p_array, p_array_body, p_rest in parse.y
- NODE_PAT_ARRAY codegen with deconstruct call and length checks
- rest variable binding via range slicing (arr[pre..-(post+1)])
- Array#deconstruct method (returns self)

Co-authored-by: Claude <noreply@anthropic.com>
2025-12-18 16:27:26 +09:00

103 lines
1.9 KiB
Ruby

##
# Array
#
# ISO 15.2.12
class Array
##
# call-seq:
# array.each {|element| ... } -> self
# array.each -> Enumerator
#
# 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
idx = 0
while idx < length
block.call(self[idx])
idx += 1
end
self
end
##
# call-seq:
# array.each_index {|index| ... } -> self
# array.each_index -> Enumerator
#
# 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
idx = 0
while idx < length
block.call(idx)
idx += 1
end
self
end
##
# call-seq:
# array.collect! {|element| ... } -> self
# array.collect! -> new_enumerator
#
# 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
idx = 0
len = size
while idx < len
self[idx] = block.call(self[idx])
idx += 1
end
self
end
##
# call-seq:
# array.map! {|element| ... } -> self
# array.map! -> new_enumerator
#
# Alias for collect!
#
# ISO 15.2.12.5.20
alias map! collect!
##
# call-seq:
# array.sort -> new_array
# array.sort {|a, b| ... } -> new_array
#
# Returns a new Array whose elements are those from `self`, sorted.
def sort(&block)
self.dup.sort!(&block)
end
##
# call-seq:
# array.deconstruct -> self
#
# Returns self. Used for array pattern matching in case/in expressions.
#
def deconstruct
self
end
##
# Array is enumerable
# ISO 15.2.12.3
include Enumerable
end