Ruby's Array # shift ne işe yarar?


90

Ruby'de Array sınıfının shift ve unshift yöntemlerinin ne yaptığını anlamakta zorlanıyorum. Biri ne yaptıklarını anlamama yardım edebilir mi?


171
Bunun dizinin diğer ucundaki shift/unshiftgibi olduğunu öğrendiğinizde, push/pophangi öğelerin 'döküldüğünü' ve hangisinin onları 'eklediğini' hatırlamak için yöntemlerin adından 'f' harfini zihinsel olarak bırakabilirsiniz. :)
— Phrogz

1
Gerçekten yardımcı olan teşekkürler.
— agentbanks217

Şimdiye kadarki en iyi yorumlardan biri! Çok teşekkürler :)
— tvdeyen

18
@Phrogz Aslında, omurgalı sindirim sistemleri yığınlardan ziyade kuyruklar olarak daha iyi modellenmiştir.
— Jian

8
@Jian :) Doğru: pushen üste ve shiftdiğer ucuna.
— Phrogz

Yanıtlar:


99

Ruby Belgelerine Bakmak

Array.shift, diziden ilk öğeyi kaldırır ve döndürür

a = [1,2,3] 
puts a.shift
 => 1 
puts a
 => [2, 3] 

Kaydırma kaldır, sağlanan değeri dizinin önüne ekleyerek diğer tüm öğeleri bir yukarı taşır

a=%w[b c d]
 => ["b", "c", "d"] 
a.unshift("a")
 => ["a", "b", "c", "d"] 

9
Temelde vardiya ve vites kaldırmayı bir FIFO kuyruğundaki işlemler olarak düşünebilirsiniz
— Jaco Pretorius

@JacoPretorius Huh? shiftve unshiftbir FILO yığını gibi davranır pushve shiftbir şey hakkında kafam karışmazsa bir FIFO kuyruğu gibi davranırım.
— Greg Schmit

@GregSchmit Ah, haklısın. Ya da aslında bir LIFO kuyruğu, değil mi?
— Jaco Pretorius

@JacoPretorius Bence LIFO == FILO (ilk giren son çıkar, eğer desen tutarsa, son girenin önce çıkması gerektiği anlamına gelir).
— Greg Schmit

@JacoPretorius LIFO ve FILO, "yığın gibi davranmak" anlamına gelir.
— Greg Schmit

54

shiftve unshiftbenzer bir şekilde hareket eder popve push: onlar ekleme hangi için yığınlarının ve kaldırma elemanları (zaman başına genellikle bir) gibi kullanım dizileri kastedilmektedir. Fark sadece budur shiftve unshiftbir başında / kaldırma elemanları eklemek Arrayaslında vardiya tüm diğer unsurları ing iken popve pushsonunda / kaldırma elemanları eklemek Arrayböylece diğer elemanların indeksleri koruyarak.

Örnekler:

                      # Spacing for clarity:
a = [2, 4, 8]    # a =>       [2, 4, 8]
a.push(16, 32)   # a =>       [2, 4, 8, 16, 32]
a.unshift(0, 1)  # a => [0, 1, 2, 4, 8, 16, 32]
a.shift          # a =>    [1, 2, 4, 8, 16, 32]
a.pop            # a =>    [1, 2, 4, 8, 16]

Mipadi dizisini özetlemek için cevabınızı düzenlerseniz, oy vermekten memnuniyet duyarım.
— Steven Sudit

Güzel. Ayrıca Ruby hakkında çok bilgili değilim, ancak JVM üzerinde çalışıyorsa, tüm bu öğeleri taşımak zorunda olmadığı için push / pop'un daha hızlı olacağını beklerdim.
— Steven Sudit

Yığın benzetmesi için oy verin, ancak boruları da düşünün. Programcı olmamız gerektiği için, vardiyanın sola kaydırma olduğunu ve kaydırmanın yatay soldan sağa dizide sağa kaydırma olduğunu da düşünmeliyiz.
— mckenzm

8

İlk öğeyi alır, diziden çıkarır ve kaldırılan öğeyi döndürür. Temelde bir diziyi yığın gibi ele almanın bir yolu: shiftpoptur, unshiftitmedir.


8
Well shift ve unshift, pop ve push'a benzer , tek farkı, sondan ziyade bir dizinin başına bir şeyler ekleyip kaldırmaları dışında.
— Alberto Santini

2
Bu cevap kesinlikle doğru soyutlama düzeyindedir.
— Steven Sudit

@Alberto: Ya da başka bir deyişle, cepheyi zirvede görüyorlar. Aksi halde olmasına gerek yoktur.
— Steven Sudit

5
Ben sadece, popve pushaynı zamanda Arrayyöntem olduğu için, kafa karışıklığının yapılmaması gerektiğine işaret ediyordum . :-)
— Alberto Santini

3
@Alberto: Bu aslında iyi bir nokta. Shift / unshift yöntemleri ön tarafı üstte kullanırken push / pop yöntemleri ucu üst olarak kullanır. Her ikisi de diziyi bir yığın olarak ele alır ve yalnızca hangi amaçla kullandıkları farklıdır.
— Steven Sudit

2

Dizinin işlenecek bir değerler sırası olduğunu düşünebiliyorsanız, bir sonraki (ön) değeri alabilir ve diğer değeri "kaydırarak" kullanılabilir olan alanı kaplayabilirsiniz. unshift, değerleri geri koyar - belki bazılarını işlemeye hazır değilsiniz veya daha sonra bazı kodların bunları işlemesine izin vereceksiniz.


1

Dizinin ilk öğesini döndürür ve diziden kaldırarak öğeleri bir sıraya kaydırır .

Çok değişken [1,2,3,4,5]

döndürür 1ve diziyi olacak şekilde ayarlar [2,3,4,5].

Daha fazlası burada .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.