Disons que j'ai un tableau Ruby
a = [1, 2, 3, 4]
Si je veux tout sauf le premier élément, je peux écrire a.drop(1)
, ce qui est génial. Si je veux tout sauf le dernier article, je ne peux penser qu'à cette façon
a[0..-2] # or
a[0...-1]
mais aucun de ceux-ci ne semble aussi propre que l'utilisation drop
. Y a-t-il d'autres moyens intégrés qui me manquent?
Réponses:
Peut-être ...
ou
ou
ou
qui renverra le dernier et quittera le tableau avec tout ce qui le précède
ou faire fonctionner l'ordinateur pour son dîner:
ou
la source
Array
me semble être la meilleure approche. La plupart des projets se retrouvent avec uncore_ext.rb
fichier avec de petites extensions comme celle-ci. Certaines bibliothèques sont pratiquement toutes des extensions comme celle-ci:ActiveSupport
par exemple.clip
méthode à la communauté Ruby? Je pense vraiment que cela devrait être là-dedans, et le patching de singe est la mauvaise chose .a.reverse.drop(1).reverse
stratégie. ;-)Par curiosité, pourquoi n'aimez-vous pas
a[0...-1]
? Vous voulez obtenir une tranche du tableau, donc l'opérateur de tranche semble être le choix idiomatique.Mais si vous avez besoin d'appeler cela partout, vous avez toujours la possibilité d'ajouter une méthode avec un nom plus convivial à la classe Array, comme DigitalRoss l'a suggéré. Peut-être comme ceci:
la source
drop_last
au fait ....
?nil
:[][1..-1]
->nil
,[][0...-1]
->[]
Un autre truc sympa
la source
a, *b = [1,2,3]
nous permettrait de regarder le tableau d'une manière voiture / cdr classique.Si vous souhaitez effectuer une
pop()
opération sur un tableau (ce qui entraînera la suppression du dernier élément), mais que vous souhaitez obtenir le tableau au lieu d'un élément popped, vous pouvez utilisertap(&:pop)
:la source
Je fais ça comme ça:
la source
Que diriez-vous d'augmenter la méthode drop elle-même, par exemple comme ça?
Ensuite, vous pouvez utiliser une taille négative pour supprimer des éléments de la fin, comme ceci:
la source
a[0...-1]
semble être le meilleur moyen. La syntaxe de découpage de tableau a été créée exactement dans ce but ...Sinon, si cela ne vous dérange pas de modifier le tableau en place, vous pouvez simplement appeler
a.pop
:la source
b = a.pop
Pour se débarrasser du dernier élément d'une ligne avec le reste retournant
Sérieusement,
la source
Ceci est le chemin:
Mais expliquons comment cela fonctionne:
L'exemple suivant retournera tous les enregistrements, de la position 0 au dernier
L'exemple suivant renverra les enregistrements d'une position à la dernière
Et ici, vous avez ce dont vous avez besoin. L'exemple suivant renverra les enregistrements de la position 0 au dernier-1
la source
-2
place de-1-1
.a[0...-1]
(remarquez le 3e point) et obtenir le même résultat quea[0..-1-1]
, car le troisième point lui dit d'exclure l'élément de fin. Voir ceci pour plus de détails.Avez-vous essayé de "prendre"
la source
a.take(a.size - 1)
; oui, j'ai envisagé cette option.Réponse:,
a.τwτ
mais vous devez d'abord installer Pyper ...Pyper intro: Connaissez-vous Lispy
car
et lecdr
retour du "premier" et du "reste" du tableau? Juste pour des besoins comme les vôtres, j'ai fait une extension de ce mécanisme Lispy. Il s'appellepyper
, et il vous permet d'accéder également au 2ème, au repos du 2ème, au 3ème, au repos de 3d, et aussi au dernier, à tout sauf le dernier, etc.caar
,cadr
,cdadar
etc. connu de Lisp:et enfin, la réponse à votre question:
Il y a plus:
Compositions:
Il y a aussi plus de caractères de commande que juste
a..f
,u..z
et0..9
, plus particulièrementm
, signifiant map:Mais d'autres caractères de commande sont trop chauds et pas très faciles à utiliser pour le moment.
la source
Cela crée un nouveau tableau avec tous les éléments de l'original sauf les derniers:
Notez que quelques autres ont suggéré d'utiliser #pop. Si vous êtes d'accord pour modifier le tableau en place, c'est très bien. Si cela ne vous convient pas, doublez d'abord le tableau, comme dans cet exemple.
la source
Je me retrouve souvent à vouloir tout sauf les n derniers éléments d'un tableau. J'ai conçu ma propre fonction pour le faire d'une manière que je trouve plus lisible que d'autres solutions:
Vous pouvez maintenant effectuer les opérations suivantes:
J'ai délibérément autorisé ArgumentError afin que l'appelant soit responsable de la façon dont il utilise cette méthode. J'aimerais entendre les commentaires / critiques de cette approche.
la source
la source