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.