151 votes

Comment retourner une partie d'un tableau en Ruby ?

Avec une liste en Python, je peux retourner une partie de celle-ci en utilisant le code suivant :

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

Comme Ruby fait tout dans des tableaux, je me demande s'il n'existe pas quelque chose de similaire.

234voto

Jeremy Ruten Points 59989

Oui, Ruby a une syntaxe de découpage de tableaux très similaire à celle de Python. Voici la ri pour la méthode d'indexation des tableaux :

--------------------------------------------------------------- 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[5, 1]                #=> []
        a[5..10]               #=> []

6 votes

Pourquoi a[5, 1] est-il différent de a[6, 1] ?

4 votes

32 votes

a[2..-1] pour aller du 3ème élément au dernier. a[2...-1] pour aller du 3ème élément jusqu'à l'avant dernier élément.

30voto

emaillenin Points 6096

Si vous voulez diviser/couper le tableau sur un indice i,

arr = arr.drop(i)

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

18voto

Manuel Points 2569

Vous pouvez utiliser tranche() pour ça :

>> 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]

Au fait, à ma connaissance, les "listes" Python ne sont que des tableaux à croissance dynamique efficacement implémentés. L'insertion au début est en O(n), l'insertion à la fin est amortie O(1), l'accès aléatoire est O(1).

0 votes

Voulez-vous utiliser le tableau de barres dans la deuxième tranche ?

0 votes

FYI : slice!() ne modifie pas le tableau en place, mais "supprime le ou les éléments donnés par un index (éventuellement jusqu'à la longueur des éléments) ou par une plage". par ruby-doc.org/core-2.2.3/Array.html#method-i-slice-21

0 votes

@joshuapinter Merci self ! Je viens de me faire piquer par ça (encore une fois, apparemment).

14voto

Pavittar Gill Points 114

Ruby 2.6 Plages sans début ni fin

(..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"]

7voto

user3449311 Points 167

Une autre façon est d'utiliser la méthode de l'intervalle

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]

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X