t;a", "b", "c", "d"]
a.last(10) # ["a", "b", "c", "d"]
[].first # nil
[].first(2) # []
drop()和take()
drop(n) → new_ary
take(n) → new_ary
take()从数组头部返回前n个元素。
drop()从数组头部删除前n个元素,然后将剩下的元素作为新数组返回。
原数组不变。
# drop()
a = ["a", "b", "c"]
a.drop(2) # 返回["c"],a不变
# take()
a = [1, 2, 3, 4, 5, 0]
a.take(3) # [1, 2, 3]
drop_while()和take_while()
drop_while {|obj| block} → new_ary
drop_while → Enumerator
take_while {|obj| block} → new_ary
take_while → Enumerator
take_while()从数组头部开始迭代元素,直到遇到不满组语句块中条件的元素停止迭代,然后返回所有已迭代的满足条件的元素。
drop_while()从数组头部开始迭代元素,一直删除元素直到遇到不满足语句块中条件的元素停止迭代。然后将剩下的元素作为新数组返回。
注意,不是原处修改。
# drop_while()
arr = [1, 2, 3, 4, 5, 6]
new_arr = arr.drop_while {|a| a<4}
p new_arr # [4, 5, 6]
p arr # [1, 2, 3, 4, 5, 6]
# take_while()
a = [1, 2, 3, 4, 5, 0]
a.take_while {|i| i < 3} #=> [1, 2]
fetch()
fetch(index) → obj
fetch(index, default) → obj
fetch(index) {|index| block} → obj
按照给定index获取数组中的元素。如果index越界,则根据三种不同形式进行处理:
- 没有给第二个参数、没有使用语句块时,直接报错
- 给了第二个参数时,index越界时将返回该第二个参数值作为默认值
- 使用了语句块时,index越界时将执行语句块中内容,并将index传递给语句块变量
a = [ 11, 22, 33, 44 ]
a.fetch(1) #=> 22
a.fetch(-1) #=> 44
a.fetch(4, 'cat') #=> "cat"
a.fetch(100) {|i| puts "#{i} is out of bounds"}
#=> "100 is out of bounds"
fill()
# 原处修改
fill(obj) → ary
fill(obj, start [, length]) → ary
fill(obj, range) → ary
fill {|index| block} → ary
fill(start [, length]) {|index| block} → ary
fill(range) {|index| block} → ary
前三种形式,据使用obj值替换数组中给定范围内元素的值:
fill(obj)
:使用obj替换所有元素
fill(obj, start [, len])
:替换从start开始,长度len个元素,没有给len则替换后面所有元素
fill(obj, range)
:替换range所指定的范围元素
后三种形式,将传递数组索引到语句块,且给定范围内的元素将使用语句块的计算结果进行替换,范围之外的则保留使用索引值元素。
a = [ "a", "b", "c", "d" ]
a.fill("x") # ["x", "x", "x", "x"]
a.fill("z", 2) # ["x", "x", "z", "z"]
a.fill("y", 0..1) # ["y", "y", "z", "z"]
a.fill {|i| i*i} # [0, 1, 4, 9]
a.fill(-2) {|i| i*i*i} # [0, 1, 8, 27]
pop()、push()和append()
push(obj, ...) → ary
append(obj, ...) → ary
pop → obj or nil
pop(n) → new_ary
注意原处修改。
- push():将给定一个或多个元素追加到数组尾部,因为返回数组自身,所以可以链式追加
- append():等价于push()
- pop():从数组尾部移除并返回1个或n个元素(此时作为数组返回),如果数组为空则返回nil。等价于
slice!(-n,n
)
# push()、append()
a = [ "a", "b", "c" ]
a.push("d","e","f") # %w[a b c d e f]
[1,2,3].push(4).push(5) # [1,2,3,4,5]
# pop()
a = [ "a", "b", "c", "d" ]
a.pop # "d"
a.pop(2) # ["b", "c"]
a # ["a"]
shift()、unshift()和prepend()
unshift(obj, ...) → ary
prepend(obj, ...) → ary
shift → obj or nil
shift(n) → new_ary
注意原处修改。
- unshift():向数组头部插入一个或多个元素,会导致整个数组原有元素后移
- prepend():等价于unshift()
- shift():从数组头部移除并返回1个或n个元素(此时以数组方式返回),会导致整个数组原有元素前移。如果数组为空则返回nil。等价于
slice!(0,n)
# unshift、prepend()
a = [ "b", "c", "d" ]
a.unshift("a") #=> ["a", "b", "c", "d"]
a.unshift(1, 2) #=> [ 1, 2, "a", "b", "c", "d"]
# shif