如何在 Ruby 中返回数组的一部分?

使用 Python 中的 list,我可以使用以下代码返回它的一部分:

foo = [1,2,3,4,5,6]
bar = [10,20,30,40,50,60]
half = len(foo) / 2
foobar = foo[:half] + bar[half:]

由于 Ruby 在数组中做所有的事情,我想知道是否有类似的东西。

187252 次浏览

你可以使用 切片():

>> foo = [1,2,3,4,5,6]
=> [1, 2, 3, 4, 5, 6]
>> bar = [10,20,30,40,50,60]
=> [10, 20, 30, 40, 50, 60]
>> half = foo.length / 2
=> 3
>> foobar = foo.slice(0, half) + bar.slice(half, foo.length)
=> [1, 2, 3, 40, 50, 60]

顺便说一下,据我所知,Python 的“列表”只是动态增长的数组的有效实现。初始插入为 O (n) ,末端插入为分摊 O (1) ,随机访问为 O (1)。

是的,Ruby 的数组切片语法与 Python 非常相似:

--------------------------------------------------------------- Array#[]
array[index]                -> obj      or nil
array[start, length]        -> an_array or nil
array[range]                -> an_array or nil
array.slice(index)          -> obj      or nil
array.slice(start, length)  -> an_array or nil
array.slice(range)          -> an_array or nil
------------------------------------------------------------------------
Element Reference---Returns the element at index, or returns a
subarray starting at start and continuing for length elements, or
returns a subarray specified by range. Negative indices count
backward from the end of the array (-1 is the last element).
Returns nil if the index (or starting index) are out of range.


a = [ "a", "b", "c", "d", "e" ]
a[2] +  a[0] + a[1]    #=> "cab"
a[6]                   #=> nil
a[1, 2]                #=> [ "b", "c" ]
a[1..3]                #=> [ "b", "c", "d" ]
a[4..7]                #=> [ "e" ]
a[6..10]               #=> nil
a[-3, 3]               #=> [ "c", "d", "e" ]
# special cases
a[5]                   #=> nil
a[6, 1]                #=> nil
a[5, 1]                #=> []
a[5..10]               #=> []

如果要分割/剪切索引 i 上的数组,

arr = arr.drop(i)


> arr = [1,2,3,4,5]
=> [1, 2, 3, 4, 5]
> arr.drop(2)
=> [3, 4, 5]

另一种方法是使用 range 方法

foo = [1,2,3,4,5,6]
bar = [10,20,30,40,50,60]
a = foo[0...3]
b = bar[3...6]


print a + b
=> [1, 2, 3, 40, 50 , 60]

我喜欢这个范围:

def first_half(list)
list[0...(list.length / 2)]
end


def last_half(list)
list[(list.length / 2)..list.length]
end

但是,对于端点是否包含在您的范围中,要非常小心。这对于一个奇长列表来说至关重要,因为在这个列表中,您需要选择打破中间的位置。否则,您最终将重复计算中间元素。

上面的示例将始终将中间元素放在后半部分。

Ruby 2.6初始/无限范围

(..1)
# or
(...1)

(1..)
# or
(1...)

[1,2,3,4,5,6][..3]
=> [1, 2, 3, 4]


[1,2,3,4,5,6][...3]
=> [1, 2, 3]

ROLES = %w[superadmin manager admin contact user]
ROLES[ROLES.index('admin')..]
=> ["admin", "contact", "user"]