Katakanlah saya memiliki array Ruby
a = [1, 2, 3, 4]
Jika saya ingin semua kecuali item pertama, saya bisa menulis a.drop(1)
, yang bagus. Jika saya ingin semua kecuali item terakhir , saya hanya bisa memikirkan cara ini
a[0..-2] # or
a[0...-1]
tapi tak satu pun dari ini tampak sebersih menggunakan drop
. Adakah cara bawaan lain yang saya lewatkan?
Jawaban:
Mungkin...
atau
atau
atau
yang akan mengembalikan yang terakhir dan meninggalkan array dengan segalanya sebelumnya
atau buat komputer berfungsi untuk makan malamnya:
atau
sumber
Array
sepertinya pendekatan terbaik bagi saya. Sebagian besar proyek berakhir dengancore_ext.rb
file dengan ekstensi kecil seperti ini. Beberapa perpustakaan secara praktis semua ekstensi seperti ini:ActiveSupport
misalnya.clip
metode ini ke komunitas Ruby? Saya benar-benar berpikir ini seharusnya ada di sana, dan menambal monyet adalah Hal yang Salah .a.reverse.drop(1).reverse
strateginya. ;-)Karena penasaran, mengapa Anda tidak suka
a[0...-1]
? Anda ingin mendapatkan sepotong array, sehingga operator slice sepertinya pilihan idiomatik.Tetapi jika Anda perlu memanggil ini di mana-mana, Anda selalu memiliki opsi untuk menambahkan metode dengan nama yang lebih ramah ke kelas Array, seperti yang disarankan DigitalRoss. Mungkin seperti ini:
sumber
drop_last
omong-omong ....
?nil
:[][1..-1]
->nil
,[][0...-1]
->[]
Trik keren lainnya
sumber
a, *b = [1,2,3]
mari kita lihat array dalam mode mobil / cdr klasik.Jika Anda ingin melakukan
pop()
operasi pada array (yang akan menghasilkan item terakhir dihapus), tetapi Anda tertarik untuk mendapatkan array daripada elemen yang muncul, Anda dapat menggunakantap(&:pop)
:sumber
Saya melakukannya seperti ini:
sumber
Bagaimana kalau menambah metode drop itu sendiri, misalnya seperti ini?
Kemudian Anda dapat menggunakan ukuran negatif untuk menghapus elemen dari ujung, seperti:
sumber
a[0...-1]
sepertinya cara terbaik. Sintaks pengiris array diciptakan untuk tujuan ini ...Atau, jika Anda tidak keberatan memodifikasi array di tempat, Anda bisa memanggil
a.pop
:sumber
b = a.pop
Untuk menghilangkan elemen terakhir dalam satu baris dengan sisanya kembali
Serius,
sumber
Begini caranya:
Tapi mari kita jelaskan bagaimana ini bekerja:
Contoh berikutnya akan mengembalikan semua catatan, dari 0 posisi ke terakhir
Contoh berikutnya akan mengembalikan catatan dari 1 posisi ke posisi terakhir
Dan di sini Anda memiliki apa yang Anda butuhkan. Contoh berikutnya akan mengembalikan catatan dari 0 posisi ke 1 terakhir
sumber
-2
alih-alih-1-1
.a[0...-1]
(perhatikan titik ke-3) dan mendapatkan hasil yang sama dengana[0..-1-1]
, karena titik ketiga memberitahu untuk mengecualikan elemen akhir. Lihat ini untuk lebih jelasnya.Sudahkah Anda mencoba "ambil"
sumber
a.take(a.size - 1)
; ya, saya mempertimbangkan opsi ini.Jawab :,
a.τwτ
tetapi Anda harus menginstal Pyper terlebih dahulu ...Pyper intro: Apakah Anda tahu Lispy
car
dancdr
mengembalikan "pertama" dan "sisanya" dari array? Hanya untuk kebutuhan seperti kebutuhan Anda, saya membuat perpanjangan mekanisme Lispy ini. Ini disebutpyper
, dan memungkinkan Anda untuk mengakses juga ke-2, istirahat dari ke-2, ke-3, istirahat dari 3d, dan juga yang terakhir, semuanya kecuali yang terakhir dll. Itu tidak akan banyak untuk ditulis, tetapi juga memungkinkan komposisi huruf, seperticaar
,cadr
,cdadar
dll diketahui dari Lisp:dan akhirnya, jawaban untuk pertanyaan Anda:
Masih ada lagi:
Komposisi:
Ada juga lebih banyak karakter perintah dari sekadar
a..f
,u..z
dan0..9
, yang paling pentingm
, yang berarti peta:Tetapi karakter perintah lainnya terlalu panas dan tidak mudah digunakan saat ini.
sumber
Ini membuat array baru dengan semua kecuali elemen terakhir dari aslinya:
Perhatikan bahwa beberapa orang lain menyarankan untuk menggunakan #pop. Jika Anda ok memodifikasi array di tempatnya, tidak apa-apa. Jika Anda tidak setuju dengan itu, dup duplikat array terlebih dahulu, seperti dalam contoh ini.
sumber
Saya sering menemukan diri saya menginginkan semua kecuali elemen terakhir dari array. Saya telah memperjelas fungsi saya sendiri untuk melakukan ini dengan cara yang menurut saya lebih mudah dibaca daripada solusi lain:
Sekarang Anda dapat melakukan hal berikut:
Saya sengaja mengizinkan ArgumentError sehingga penelepon bertanggung jawab atas cara mereka menggunakan metode ini. Saya ingin mendengar komentar / kritik terhadap pendekatan ini.
sumber
sumber