Digamos que eu tenho uma matriz Ruby
a = [1, 2, 3, 4]
Se eu quiser tudo, menos o primeiro item, posso escrever a.drop(1)
, o que é ótimo. Se eu quero tudo menos o último item, só consigo pensar dessa maneira
a[0..-2] # or
a[0...-1]
mas nenhum deles parece tão limpo quanto o uso drop
. Falta alguma outra maneira embutida?
Respostas:
Possivelmente...
ou
ou
ou
que retornará o último e deixará a matriz com tudo antes
ou faça o computador funcionar para o jantar:
ou
fonte
Array
parece a melhor abordagem para mim. A maioria dos projetos acaba com umcore_ext.rb
arquivo com pequenas extensões como esta. Algumas bibliotecas são praticamente todas as extensões como esta:ActiveSupport
por exemplo.clip
método para a comunidade Ruby? Eu realmente acho que isso deve estar lá, e a correção de macacos é a coisa errada .a.reverse.drop(1).reverse
estratégia. ;-)Por curiosidade, por que você não gosta
a[0...-1]
? Você deseja obter uma fatia da matriz, para que o operador de fatia pareça a escolha idiomática.Mas se você precisar chamar isso em todo o lugar, sempre terá a opção de adicionar um método com um nome mais amigável à classe Array, como sugeriu o DigitalRoss. Talvez assim:
fonte
drop_last
a propósito ... #.
?nil
:[][1..-1]
->nil
,[][0...-1]
->[]
Outro truque legal
fonte
a, *b = [1,2,3]
, veríamos a matriz de uma maneira clássica de carro / cdr.Se você deseja executar uma
pop()
operação em uma matriz (o que resultará no último item excluído), mas está interessado em obter a matriz em vez de um elemento pop-up, você pode usartap(&:pop)
:fonte
Eu faço assim:
fonte
Que tal aumentar o próprio método drop, por exemplo, como este?
Em seguida, você pode usar um tamanho negativo para remover elementos do final, da seguinte maneira:
fonte
a[0...-1]
parece ser o melhor caminho. A sintaxe de divisão da matriz foi criada exatamente para esse fim ...Como alternativa, se você não se importa em modificar a matriz, basta chamar
a.pop
:fonte
b = a.pop
Para se livrar do último elemento em uma linha com o restante retornando
Sério, porém,
fonte
Este é o caminho:
Mas vamos explicar como isso funciona:
O próximo exemplo retornará todos os registros, da posição 0 à última
O próximo exemplo retornará registros da 1 posição para a última
E aqui você tem o que precisa. O próximo exemplo retornará registros da posição 0 para a última-1
fonte
-2
vez de-1-1
.a[0...-1]
(observe o terceiro ponto) e obter o mesmo resultado quea[0..-1-1]
, porque o terceiro ponto diz para excluir o elemento final. Veja isso para mais detalhes.Você já tentou "levar"
fonte
a.take(a.size - 1)
; sim, considerei essa opção.Resposta :,
a.τwτ
mas você precisa instalar o Pyper primeiro ...Introdução ao Pyper: você conhece Lispy
car
ecdr
retorna "primeiro" e "resto" da matriz? Apenas para necessidades como a sua, fiz uma extensão desse mecanismo Lispy. É chamadopyper
e permite acessar também o 2º, o restante do 2º, o 3º, o restante do 3d e também o último, tudo, exceto o último etc. Isso não seria muito para se escrever, mas também permite a composição de letras, assim comocaar
,cadr
,cdadar
etc conhecido a partir Lisp:e, finalmente, a resposta para sua pergunta:
Há mais:
Composições:
Há também mais caracteres de comando do que apenas
a..f
,u..z
e0..9
, mais notavelmentem
, significando mapa:Mas outros caracteres de comando são muito quentes e não são muito fáceis de usar no momento.
fonte
Isso cria uma nova matriz com todos, exceto os últimos elementos do original:
Observe que alguns outros sugeriram o uso de #pop. Se você está bem, modificando a matriz no local, tudo bem. Se você não concorda com isso, duplique a matriz primeiro, como neste exemplo.
fonte
Costumo encontrar-me querendo todos, exceto os últimos n elementos de uma matriz. Eu montei minha própria função para fazer isso de uma maneira que eu acho mais legível que outras soluções:
Agora você pode fazer o seguinte:
Eu permiti deliberadamente o ArgumentError para que o responsável pela chamada seja responsável por como eles usam esse método. Eu adoraria ouvir comentários / críticas dessa abordagem.
fonte
fonte