Digamos que tengo un Rubí matriz

a = [1, 2, 3, 4]

Si quiero todos, pero el primer elemento, puedo escribir a.drop(1), lo cual es genial. Si quiero a todos, pero el última elemento, sin embargo, sólo puedo pensar de esta manera

a[0..-2]   # or
a[0...-1]

pero ninguno de estos parece tan limpio como el uso de drop. Cualquier otro integrado en maneras que me falta?

  • De acuerdo a la globalnerdy.com/2008/07/10/… , caída de ruby 1.9, en lugar de ruby 1.8.6
  • Lo que sobre el rendimiento.. Si yo fuera a utilizar estas respuestas en iteraciones para 1000 veces.. que uno iba a ganar?
  • En otras palabras, que la solución no atraviesa la matriz bajo el capó?
  • de otra manera, a – ([a.tamaño])
InformationsquelleAutor Peter | 2009-10-21

14 Comentarios

  1. 122

    Tal vez…

    a = t               # => [1, 2, 3, 4]
    a.first a.size - 1  # => [1, 2, 3]

    o

    a.take 3

    o

    a.first 3

    o

    a.pop

    que se devolverá el último y salir de la matriz con todo antes de que

    o hacer el trabajo de la computadora para su cena:

    a.reverse.drop(1).reverse

    o

    class Array
      def clip n=1
        take size - n
      end
    end
    a          # => [1, 2, 3, 4]
    a.clip     # => [1, 2, 3]
    a = a + a  # => [1, 2, 3, 4, 1, 2, 3, 4]
    a.clip 2   # => [1, 2, 3, 4, 1, 2]
    • Agregar un método a Array parece el mejor enfoque para mí. La mayoría de los proyectos terminan con un core_ext.rb archivo con poco extensiones como esta. Algunas bibliotecas están prácticamente en todo extensiones como esta: ActiveSupport por ejemplo.
    • Que interesante, me he preguntado ¿cómo de común es. ¿Qué piensa la gente acerca de la poesía modo?
    • ¿Cómo puede alguien enviar este clip método para la comunidad de Ruby? Realmente creo que esto debería estar ahí, y monkey patching es el Cosa Incorrecta.
    • Me gusta la a.reverse.drop(1).reverse estrategia. 😉
    • otras opciones incluyen shift y slice..
  2. 86

    Por curiosidad, ¿por qué no te gusta a[0...-1]? Quieres obtener una rebanada de la matriz, por lo que el sector del operador se parece a la idiomáticas elección.

    Pero si necesita llamar a esto en todo el lugar, usted siempre tiene la opción de agregar un método con más nombre descriptivo para la clase Array, como DigitalRoss sugerido. Tal vez como este:

    class Array
        def drop_last
            self[0...-1]
        end
    end
    • parece como un montón de desorden, cuando la caída es tan limpio. no es una gran cosa, pero es difícil de confirmar en un breve vistazo que es exactamente correcto. Prefiero su nombre, drop_last, por el camino…
    • Me encanta el uso de -1 mucho más elegante que el uso de .longitud
    • Curioso, ¿cuál es el significado de la tercera .?
    • … los medios no incluyendo el último elemento, El -1 es el último elemento. Si usted hizo dos puntos, entonces se podría incluir el último elemento, tres puntos, a continuación, no incluye el último elemento.
    • Ser cuidadosos con la rebanada del operador para obtener la cola de la matriz: se puede devolver nil: [][1..-1] -> nil, [][0...-1]->[]
    • Al llegar a la cola de la matriz de la ActiveSupport del Array#from puede ser de uso api.rubyonrails.org/classes/Array.html#method-i-from.

  3. 53

    Otro truco de

    >> *a, b = [1,2,3]
    => [1, 2, 3]
    >> a
    => [1, 2]
    >> b
    => 3
    • Agradable, no era consciente de Ruby fue esto; por lo tanto a, *b = [1,2,3] gustaría que nos veamos en la serie en un coche clásico/cdr de la moda.
    • Honestamente, yo no recuerdo haber escrito ese comentario 😀 eliminado ahora…
    • Taaaan sencillo y agradable. THX
  4. 38

    Si quieres realizar una pop() operación en una matriz (que va a resultar en el último elemento que se elimina), pero usted está interesado en la obtención de la matriz en lugar de una aparecido elemento, puede utilizar tap(&:pop):

    > arr = [1, 2, 3, 4, 5]
    > arr.pop
    => 5
    > arr
    => [1, 2, 3, 4]
    > arr.tap(&:pop)
    => [1, 2, 3]
    • Esta respuesta es la que semánticamente tiene más sentido para este usuario. El espejo de las operaciones están a la mano y utiliza palabras que son fáciles de interpretar && conciso.
    • Esa es una mancha de Ruby.
  5. 30

    Yo lo hago así:

    my_array[0..-2]
    • Esto funciona fantásticamente. Estoy confundido ¿por qué hay una serie de respuestas más complejas. Es este un nuevo Ruby, además?
  6. 21

    Acerca de cómo aumentar el método de la gota, por ejemplo como esta?

    class Array
      def drop(n)
        n < 0 ? self[0...n] : super
      end
    end

    Entonces usted puede utilizar un negativo de tamaño para eliminar elementos de la final, así:

    [1, 2, 3, 4].drop(-1) #=> [1, 2, 3]
    [1, 2, 3, 4].drop(-2) #=> [1, 2]
  7. 18

    a[0...-1] parece que la mejor manera. La matriz de rebanar sintaxis fue creada para este propósito…

    Alternativamente, si no te importa la modificación de la matriz en su lugar, usted puede llamar a a.pop:

    >> a = [1, 2, 3, 4]
    >> a.pop
    >> a
    => [1, 2, 3]
    • también puede asignar último elemento de una variable para su posterior uso: b = a.pop
  8. 10

    Este es el camino:

    [1,2,3,4,5][0..-1-1]

    Pero vamos a explicar cómo funciona esto:

    a = [1,2,3,4,5]

    Siguiente ejemplo devolverá todos los registros, a partir de la posición 0 a la última

    a[0..-1]
    => [1, 2, 3, 4, 5]

    Siguiente ejemplo se devuelve los registros de la posición 1 a la última

    a[1..-1]
    => [2, 3, 4, 5]

    Y aquí tienes lo que necesitas. Siguiente ejemplo se devuelve los registros a partir de la posición 0 a la última-1

    a[0..-1-1]
    => [1, 2, 3, 4]
    • Usted puede escribir -2 en lugar de -1-1.
    • sí, yo a la izquierda -1-1 sólo para explicar el concepto
  9. 10

    Para deshacerse de el último elemento en una línea con el resto de regresar

    [1, 2, 4, 5, 6].reverse.drop(1).reverse

    Serio, aunque,

    [1,2,3,4][0..-2]
    #=> [1,2,3]
    • este movimiento se siente como una especie de patineta truco o algo
  10. 2

    Respuesta: a.τwτ, pero usted tiene que instalar Pyper primera…

    Pyper intro: ¿sabes Lispy car y cdr volver «primer» y el «resto» de la matriz? Sólo para las necesidades como la suya, me hizo una extensión de este Lispy mecanismo. Se llama pyper, y permite también el acceso 2º, resto de 2º, 3º, resto de 3d, y también la última, todo, excepto la última etc. Que no sería mucho que escribir, pero también permite que la composición de cartas, como caar, cadr, cdadar etc. conocido desde Lisp:

    # First, gem install pyper
    require 'pyper'
    include Pyper
    a = %w/lorem ipsum dolor sit amet/
    # To avoid confusion with other methods, and also because it resembles a rain gutter,
    # Greek letter τ is used to delimit Pyper methods:
    aaτ #=> "lorem"
    adτ #=> ["ipsum", "dolor", "sit", "amet"]
    abτ #=> "ipsum"
    aeτ #=> ["dolor", "sit", "amet"]
    acτ #=> "dolor" (3rd)
    azτ #=> "amet" (last)
    ayτ #=> "sit" (2nd from the end)
    axτ #=> "dolor" (3rd from the end)

    y, finalmente, la respuesta a tu pregunta:

    awτ #=> ["lorem", "ipsum", "dolor", "sit"] (all except last)

    Hay más:

    auτ #=> ["lorem", "ipsum", "dolor"] (all except last 2)
    a1τ #=> ["lorem", "ipsum"] (first 2)
    a8τ #=> (last 2)
    a7τ #=> (last 3)

    Composiciones:

    awydτ #=> "olor" (all except 1st letter of the last word of all-except-last array)

    También hay comando más caracteres de los que sólo a..f, u..z y 0..9, más notablemente m, significado mapa:

    awmbτ #=> ["o", "p", "o", "i"] (second letters of all-except-last array)

    Pero otros comandos de caracteres son demasiado caliente y no muy fácil de utilizar en el momento.

    • Estoy leyendo esta en 1 de abril, así que supuse que era una broma… nope. No tenía idea de esto existía para Ruby. 🙂
  11. 1

    Esto hace que un nuevo array con todos, pero el último de los elementos de la original:

    ary2 = ary.dup
    ary2.pop

    Tenga en cuenta que algunos otros han sugerido el uso de #pop. Si usted es aceptar la modificación de la matriz en su lugar, eso está bien. Si no estás bien con eso, entonces dup la matriz en primer lugar, como en este ejemplo.

    • Algunos otros han sugerido el uso de #pop, si usted es aceptar la modificación de la matriz en su lugar. Si no estás bien con eso, entonces dup la matriz en primer lugar, como en este ejemplo.
    • Este es un comentario importante. Usted puede simplemente añadir a tu respuesta así. Desde #pop no tiene un bang (!), el hecho de que se modifica la matriz original podría escapar de la gente.
    • Esta es la forma ineficiente si la matriz es grande.
  12. 1

    A menudo me encuentro que quieren todos, pero la última de n elementos de una matriz. He amañado hasta mi propia función para hacer esto de una manera que me parece más fácil de leer que otras soluciones:

    class Array
      def all_but_the_last(n)
        self.first(self.size - n)
      end
    end

    Ahora usted puede hacer lo siguiente:

    arr = ["One", "Two", "Three", "Four", "Five"]
    # => ["One", "Two", "Three", "Four", "Five"]
    
    arr.all_but_the_last(1)
    # => ["One", "Two", "Three", "Four"]
    
    arr.all_but_the_last(3)
    # => ["One", "Two"]
    
    arr.all_but_the_last(5)
    # => []
    
    arr.all_but_the_last(6)
    # ArgumentError: negative array size

    He permitido deliberadamente para el ArgumentError por lo que el llamante es responsable de cómo se utiliza este método. Me encantaría escuchar comentarios/críticas a este enfoque.

Dejar respuesta

Please enter your comment!
Please enter your name here