Kecuali jika input pengguna adalah satu kata atau angka, maka input itu perlu membagi atau diubah menjadi daftar string atau angka.
Misalnya, jika suatu program meminta nama lengkap Anda, termasuk inisial tengah, pertama-tama perlu membagi input itu menjadi tiga yang terpisah string sebelum dapat bekerja dengan nama depan, tengah, dan belakang pribadi Anda. Ini dicapai dengan menggunakan String # split metode.
Cara Kerja String # split
Dalam bentuknya yang paling dasar, String # split mengambil argumen tunggal: pembatas bidang sebagai string. Pembatas ini akan dihapus dari output dan array string yang dibagi pada pembatas akan dikembalikan.
Jadi, dalam contoh berikut, dengan asumsi pengguna memasukkan nama mereka dengan benar, Anda harus menerima tiga elemen Himpunan dari perpecahan.
#! / usr / bin / env ruby
print "Siapa nama lengkap Anda? "
full_name = gets.chomp
name = full_name.split ('')
menempatkan "Nama depan Anda adalah # {name.first}"
menempatkan "Nama belakang Anda adalah # {name.last}"
Jika kami menjalankan program ini dan memasukkan nama, kami akan mendapatkan hasil yang diharapkan. Juga, perhatikan itu nama dulu dan name.last adalah kebetulan. Itu nama variabel akan menjadi Himpunan, dan kedua pemanggilan metode tersebut akan setara dengan nama [0] dan nama [-1] masing-masing.
$ ruby split.rb
Apa nama lengkap Anda? Michael C. Morin
Nama depan Anda adalah Michael
Nama belakangmu adalah Morin
Namun, String # split sedikit lebih pintar dari yang Anda kira. Jika argumen ke String # split adalah string, ia memang menggunakannya sebagai pembatas, tetapi jika argumennya adalah string dengan spasi tunggal (seperti yang kita gunakan), maka itu menyimpulkan bahwa Anda ingin membagi pada jumlah spasi putih dan bahwa Anda juga ingin menghapus spasi putih terkemuka.
Jadi, jika kita memberikan beberapa input yang sedikit cacat seperti
Michael C. Morin
(dengan spasi tambahan), lalu String # split akan tetap melakukan apa yang diharapkan. Namun, itulah satu-satunya kasus khusus ketika Anda lulus a Tali sebagai argumen pertama. Pembatas Ekspresi Reguler
Anda juga bisa memberikan ekspresi reguler sebagai argumen pertama. Sini, String # split menjadi sedikit lebih fleksibel. Kita juga dapat membuat kode pemisahan nama kecil kita sedikit lebih pintar.
Kami tidak ingin periode di akhir inisial tengah. Kami tahu ini adalah inisial tengah, dan database tidak akan menginginkan periode di sana, sehingga kami dapat menghapusnya saat kami membagi. Kapan String # split cocok dengan ekspresi reguler, ia melakukan hal yang persis sama seolah-olah baru saja cocok dengan pembatas string: ia mengeluarkannya dari output dan membaginya pada saat itu.
Jadi, kita dapat sedikit mengembangkan contoh kita:
$ cat split.rb
#! / usr / bin / env ruby
print "Siapa nama lengkap Anda? "
full_name = gets.chomp
name = full_name.split (/ \.? \ s + /)
menempatkan "Nama depan Anda adalah # {name.first}"
menempatkan "Inisial tengah Anda adalah # {nama [1]}"
menempatkan "Nama belakang Anda adalah # {name.last}"
Pemisah Rekam Default
Rubi tidak terlalu besar pada "variabel khusus" yang mungkin Anda temukan dalam bahasa seperti Perl, tetapi String # split tidak menggunakan yang Anda perlu ketahui. Ini adalah variabel pemisah rekaman default, juga dikenal sebagai $;.
Ini adalah global, sesuatu yang tidak sering Anda lihat di Ruby, jadi jika Anda mengubahnya, itu mungkin memengaruhi bagian lain dari kode — pastikan untuk mengubahnya kembali ketika selesai.
Namun, semua variabel ini berfungsi sebagai nilai default untuk argumen pertama String # split. Secara default, variabel ini tampaknya disetel ke nol. Namun, jika String # splitArgumen pertama adalah nol, itu akan menggantinya dengan string spasi tunggal.
Pembatas Tanpa Panjang
Jika pembatas dilewatkan ke String # split adalah string nol panjang atau ekspresi reguler, kemudian String # split akan bertindak sedikit berbeda. Ini tidak akan menghapus apa pun dari string asli dan membelah setiap karakter. Ini pada dasarnya mengubah string menjadi array dengan panjang yang sama yang hanya berisi string satu karakter, satu untuk setiap karakter dalam string.
Ini dapat berguna untuk iterasi pada string dan digunakan pada pra-1.9.x dan pra-1.8.7 (yang mendukung sejumlah fitur mulai dari 1.9.x) untuk mengulangi karakter dalam sebuah string tanpa khawatir putus multi-byte Karakter Unicode. Namun, jika yang benar-benar ingin Anda lakukan adalah mengulangi sebuah string, dan Anda menggunakan 1.8.7 atau 1.9.x, Anda mungkin harus menggunakan String # each_char sebagai gantinya.
#! / usr / bin / env ruby
str = "Dia mengubahku menjadi kadal!"
str.split (''). masing-masing do | c |
menempatkan c
akhir
Membatasi Panjang Array yang Dikembalikan
Jadi kembali ke contoh parsing nama kita, bagaimana jika seseorang memiliki spasi di nama belakang mereka? Misalnya, nama keluarga Belanda seringkali dapat dimulai dengan "van" (yang berarti "dari" atau "dari").
Kami hanya benar-benar menginginkan 3 elemen Himpunan, jadi kita bisa menggunakan argumen kedua untuk String # split yang sejauh ini kita abaikan. Argumen kedua diharapkan menjadi a Fixnum. Jika argumen ini positif, paling banyak, bahwa banyak elemen akan diisi dalam array. Jadi dalam kasus kami, kami ingin memberikan angka 3 untuk argumen ini.
#! / usr / bin / env ruby
print "Siapa nama lengkap Anda? "
full_name = gets.chomp
name = full_name.split (/ \.? \ s + /, 3)
menempatkan "Nama depan Anda adalah # {name.first}"
menempatkan "Inisial tengah Anda adalah # {nama [1]}"
menempatkan "Nama belakang Anda adalah # {name.last}"
Jika kita menjalankan ini lagi dan memberinya nama Belanda, itu akan bertindak seperti yang diharapkan.
$ ruby split.rb
Apa nama lengkap Anda? Vincent Willem van Gogh
Nama depan kamu adalah Vincent
Inisial tengah Anda adalah Willem
Nama belakang Anda adalah van Gogh
Namun, jika argumen ini negatif (angka negatif apa pun), maka tidak akan ada batasan jumlah elemen dalam larik output dan pembatas trailing apa pun akan muncul sebagai string panjang nol di akhir Himpunan.
Ini ditunjukkan dalam cuplikan IRB ini:
: 001> "this, is, a, test" .split (',', -1)
=> ["ini", "adalah", "a", "tes", "", "", "", ""]