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

Chr*_*ldt 113 ruby arrays list slice

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

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

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

Jer*_*ten 175

是的,Ruby具有与Python非常相似的数组切片语法.以下是ri数组索引方法的文档:

--------------------------------------------------------------- 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]               #=> []
Run Code Online (Sandbox Code Playgroud)

  • `a [2 ..- 1]`从第3个元素到最后一个元素.`a [2 ... -1]`从第3个元素到第二个元素. (24认同)
  • 为什么[5,1]与[6,1]不同? (5认同)
  • @dertoni:http://stackoverflow.com/questions/3219229/why-does-array-slice-behave-differently-for-length-n (3认同)
  • @CleverProgrammer 语法比公认的答案更接近 Python。我喜欢 Ruby,但我必须说 Python 的语法更短、更清晰。作为奖励,可以指定步骤:`range(10)[:5:-1]` (2认同)

Len*_*ran 26

如果要在索引i上拆分/剪切数组,

arr = arr.drop(i)

> arr = [1,2,3,4,5]
 => [1, 2, 3, 4, 5] 
> arr.drop(2)
 => [3, 4, 5] 
Run Code Online (Sandbox Code Playgroud)


Man*_*uel 17

你可以使用slice():

>> 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]
Run Code Online (Sandbox Code Playgroud)

顺便说一下,据我所知,Python"列表"只是有效地实现了动态增长的数组.开头的插入是在O(n)中,最后插入是分摊O(1),随机访问是O(1).


小智 7

另一种方法是使用范围方法

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]
Run Code Online (Sandbox Code Playgroud)


PGi*_*ill 7

Ruby 2.6 无止境/无止境范围

(..1)
# or
(...1)
Run Code Online (Sandbox Code Playgroud)

(1..)
# or
(1...)
Run Code Online (Sandbox Code Playgroud)

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

[1,2,3,4,5,6][...3]
 => [1, 2, 3]
Run Code Online (Sandbox Code Playgroud)

ROLES = %w[superadmin manager admin contact user]
ROLES[ROLES.index('admin')..]
=> ["admin", "contact", "user"]
Run Code Online (Sandbox Code Playgroud)

  • 稍微解释一下就好了,特别是因为 `[..3]` 返回了一个不直观的结果。 (2认同)