Saya mengalami kesulitan memahami apa yang dilakukan metode shift dan unshift dari kelas Array di Ruby. Adakah yang bisa membantu saya memahami apa yang mereka lakukan?
Setelah Anda mempelajarinya shift/unshiftseperti push/popdi ujung lain larik, Anda dapat secara mental membuang 'f' dari nama metode untuk mengingat elemen 'membuang' yang mana dan mana yang 'menyisipkan'. :)
Phrogz
1
Terima kasih yang benar-benar membantu lol.
agentbanks217
Salah satu komentar terbaik yang pernah ada! Terima kasih banyak :)
tvdeyen
18
@Phrogz Sebenarnya, sistem pencernaan vertebrata lebih baik dimodelkan sebagai antrian daripada sebagai tumpukan.
Jian
8
@Jian :) Benar: pushitu di atas, dan shiftkeluar di ujung lainnya.
Anda pada dasarnya dapat menganggap shift dan unshift sebagai operasi dalam antrian FIFO
Jaco Pretorius
@JacoPinkus Huh? shiftdan unshiftbertindak seperti tumpukan FILO, pushdan shiftakan bertindak seperti antrian FIFO, kecuali saya bingung tentang sesuatu.
Greg Schmit
@GregSchmit Ah, kamu benar. Atau sebenarnya, antrian LIFO, bukan?
Jaco Pretorius
@ JacoPretorius Yah saya pikir LIFO == FILO (pertama keluar terakhir menyiratkan bahwa yang terakhir harus keluar terlebih dahulu jika polanya berlaku).
Greg Schmit
@JacoPretusus Baik LIFO maupun FILO berarti "berperilaku seperti tumpukan".
Greg Schmit
54
shiftdan unshiftbertindak dengan cara yang sama seperti popdan push: mereka dimaksudkan untuk menggunakan array sebagai tumpukan yang Anda dapat menambahkan dan menghapus elemen (biasanya satu per waktu). Perbedaannya hanya itu shiftdan unshiftmenambah / menghapus elemen di awal Array, sebenarnya menggeser semua elemen lainnya, sedangkan popdan pushmenambah / menghapus elemen di akhir Array, sehingga mempertahankan indeks elemen lainnya.
Contoh:
# 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]
Jika Anda mengedit jawaban Anda untuk meringkas utas mipadi, saya akan dengan senang hati memberi suara positif.
Steven Sudit
Keren. Juga, saya tidak terlalu tahu tentang Ruby, tetapi jika itu berjalan di JVM maka saya berharap push / pop akan lebih cepat, karena tidak harus memindahkan semua elemen itu.
Steven Sudit
Suara positif untuk analogi tumpukan, tetapi pikirkan juga pipa. Karena kita seharusnya menjadi programmer, kita juga harus berpikir shift adalah shift-left dan unshift adalah shift-right pada larik horizontal kiri ke kanan.
mckenzm
8
Itu mengambil elemen pertama, menghapusnya dari array, dan mengembalikan elemen yang dihapus. Ini pada dasarnya adalah cara untuk memperlakukan array seperti tumpukan: shiftis pop, unshiftis push.
Well shift dan unshift mirip dengan pop dan push, kecuali mereka menambah dan menghapus barang dari awal larik, bukan dari akhir.
Alberto Santini
2
Jawaban ini tepat pada tingkat abstraksi yang benar.
Steven Sudit
@Alberto: Atau, dengan kata lain, mereka menganggap depan sebagai yang teratas. Tidak ada persyaratan untuk menjadi sebaliknya.
Steven Sudit
5
Saya baru saja menunjukkan bahwa, karena popdan pushjuga merupakan Arraymetode, kebingungan tidak boleh dibuat. :-)
Alberto Santini
3
@Alberto: Itu sebenarnya poin yang bagus. Metode shift / unshift menggunakan bagian depan sebagai atas sedangkan metode push / pop menggunakan bagian ujung sebagai atas. Keduanya memperlakukan array sebagai tumpukan, hanya berbeda pada ujung mana yang mereka gunakan.
Steven Sudit
2
Jika Anda dapat menganggap array sebagai antrian nilai yang akan diproses, maka Anda dapat mengambil nilai berikutnya (depan) dan "menggeser" nilai lainnya untuk menempati ruang yang tersedia. unshift memasukkan kembali nilai - mungkin Anda belum siap untuk memproses beberapa di antaranya, atau akan membiarkan kode lain menanganinya.
shift/unshift
sepertipush/pop
di ujung lain larik, Anda dapat secara mental membuang 'f' dari nama metode untuk mengingat elemen 'membuang' yang mana dan mana yang 'menyisipkan'. :)push
itu di atas, danshift
keluar di ujung lainnya.Jawaban:
Melihat Dokumentasi Ruby
Array.shift menghapus elemen pertama dari array dan mengembalikannya
a = [1,2,3] puts a.shift => 1 puts a => [2, 3]
Unshift menambahkan nilai yang diberikan ke depan larik, memindahkan semua elemen lainnya ke atas satu
a=%w[b c d] => ["b", "c", "d"] a.unshift("a") => ["a", "b", "c", "d"]
sumber
shift
danunshift
bertindak seperti tumpukan FILO,push
danshift
akan bertindak seperti antrian FIFO, kecuali saya bingung tentang sesuatu.shift
danunshift
bertindak dengan cara yang sama sepertipop
danpush
: mereka dimaksudkan untuk menggunakan array sebagai tumpukan yang Anda dapat menambahkan dan menghapus elemen (biasanya satu per waktu). Perbedaannya hanya itushift
danunshift
menambah / menghapus elemen di awalArray
, sebenarnya menggeser semua elemen lainnya, sedangkanpop
danpush
menambah / menghapus elemen di akhirArray
, sehingga mempertahankan indeks elemen lainnya.Contoh:
# 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]
sumber
Itu mengambil elemen pertama, menghapusnya dari array, dan mengembalikan elemen yang dihapus. Ini pada dasarnya adalah cara untuk memperlakukan array seperti tumpukan:
shift
is pop,unshift
is push.sumber
pop
danpush
juga merupakanArray
metode, kebingungan tidak boleh dibuat. :-)Jika Anda dapat menganggap array sebagai antrian nilai yang akan diproses, maka Anda dapat mengambil nilai berikutnya (depan) dan "menggeser" nilai lainnya untuk menempati ruang yang tersedia. unshift memasukkan kembali nilai - mungkin Anda belum siap untuk memproses beberapa di antaranya, atau akan membiarkan kode lain menanganinya.
sumber
Ini mengembalikan elemen pertama dari array, dan menghapusnya dari array, menggeser elemen kembali ke satu tempat.
Sangat bergeser
[1,2,3,4,5]
mengembalikan
1
, dan menyetel larik menjadi[2,3,4,5]
.Lebih lanjut di sini .
sumber