Di Ruby beberapa metode memiliki tanda tanya ( ?
) yang menanyakan pertanyaan seperti include?
itu menanyakan apakah objek yang dimaksud disertakan, ini kemudian mengembalikan true / false.
Tetapi mengapa beberapa metode memiliki tanda seru ( !
) di mana yang lain tidak?
Apa artinya?
Jawaban:
Secara umum, metode yang berakhir
!
menunjukkan bahwa metode akan memodifikasi objek yang dipanggil . Ruby menyebut ini sebagai " metode berbahaya " karena mereka mengubah keadaan yang mungkin menjadi referensi orang lain. Berikut ini contoh sederhana untuk string:Ini akan menampilkan:
Di perpustakaan standar, ada banyak tempat Anda akan melihat pasangan metode yang bernama sama, satu dengan
!
dan yang tanpa. Yang tanpa disebut "metode aman", dan mereka mengembalikan salinan aslinya dengan perubahan diterapkan pada salinan , dengan callee tidak berubah. Inilah contoh yang sama tanpa!
:Output ini:
Ingatlah ini hanya sebuah konvensi, tetapi banyak kelas Ruby mengikutinya. Ini juga membantu Anda melacak apa yang akan dimodifikasi dalam kode Anda.
sumber
save
dansave!
inActiveRecord
Tanda seru berarti banyak hal, dan kadang-kadang Anda tidak bisa mengatakan banyak hal darinya selain "ini berbahaya, hati-hati".
Seperti yang orang lain katakan, dalam metode standar sering digunakan untuk menunjukkan metode yang menyebabkan objek bermutasi, tetapi tidak selalu. Perhatikan bahwa banyak metode standar mengubah receiver mereka dan tidak memiliki tanda seru (
pop
,shift
,clear
), dan beberapa metode dengan tanda seru tidak mengubah penerima mereka (exit!
). Lihat artikel ini misalnya.Perpustakaan lain mungkin menggunakannya secara berbeda. Dalam Rails, tanda seru seringkali berarti bahwa metode ini akan mengeluarkan pengecualian pada kegagalan daripada gagal secara diam-diam.
Ini adalah konvensi penamaan tetapi banyak orang menggunakannya dengan cara yang sedikit berbeda. Dalam kode Anda sendiri, aturan praktis yang baik adalah menggunakannya setiap kali suatu metode melakukan sesuatu yang "berbahaya", terutama ketika dua metode dengan nama yang sama ada dan salah satunya lebih "berbahaya" daripada yang lain. "Berbahaya" bisa berarti hampir apa saja.
sumber
Konvensi penamaan ini diangkat dari Skema .
sumber
! biasanya berarti bahwa metode bertindak atas objek alih-alih mengembalikan hasil. Dari buku Ruby Pemrograman :
sumber
Paling akurat untuk mengatakan bahwa metode dengan Bang! adalah versi yang lebih berbahaya atau mengejutkan . Ada banyak metode yang bermutasi tanpa Bang seperti
.destroy
dan dalam metode umum hanya memiliki poni di mana alternatif yang lebih aman ada di inti lib.Sebagai contoh, pada Array yang kita miliki
.compact
dan.compact!
, kedua metode memutasi array, tetapi.compact!
mengembalikan nihil bukan diri jika tidak ada nol dalam array, yang lebih mengejutkan daripada hanya mengembalikan diri.Metode-satunya non-bermutasi saya telah menemukan dengan bang adalah
Kernel
's.exit!
yang lebih mengejutkan daripada.exit
karena Anda tidak dapat menangkapSystemExit
sedangkan proses adalah penutupan.Rails dan ActiveRecord melanjutkan tren ini karena menggunakan bang untuk efek
.create!
yang lebih 'mengejutkan' seperti yang meningkatkan kesalahan pada kegagalan.sumber
Dari themomorohoax.com:
Ledakan dapat digunakan dengan cara di bawah ini, sesuai dengan preferensi pribadi saya.
Intinya adalah: gunakan bang saja saat Anda benar-benar berpikir apakah perlu, untuk menyelamatkan pengembang lain, kesal karena harus memeriksa mengapa Anda menggunakan bang.
Ledakan ini memberikan dua isyarat kepada pengembang lain.
http://www.themomorohoax.com/2009/02/11/when-to-use-a-bang-exclamation-point-after-rails-methods
sumber
Penjelasan sederhana:
Tetapi jika Anda pernah memanggil metode
downcase!
dalam penjelasan di atas,foo
akan berubah menjadi downcase secara permanen.downcase!
tidak akan mengembalikan objek string baru tetapi mengganti string di tempatnya, benar-benar mengubahfoo
ke huruf kecil. Saya sarankan Anda tidak menggunakandowncase!
kecuali itu benar-benar diperlukan.sumber
Saya suka menganggap ini sebagai perubahan eksplosif yang menghancurkan semua yang telah terjadi sebelumnya. Bang atau tanda seru berarti bahwa Anda membuat perubahan permanen yang disimpan dalam kode Anda.
Jika Anda menggunakan misalnya metode Ruby untuk substitusi global
gsub!
, substitusi yang Anda buat bersifat permanen.Cara lain yang dapat Anda bayangkan, adalah membuka file teks dan melakukan pencarian dan ganti, diikuti dengan menyimpan.
!
melakukan hal yang sama dalam kode Anda.Pengingat lain yang bermanfaat jika Anda berasal dari dunia bash adalah
sed -i
memiliki efek yang sama yaitu membuat perubahan permanen yang disimpan.sumber
Disebut "Metode Merusak" Mereka cenderung mengubah salinan asli dari objek yang Anda maksud.
sumber
Intinya:
!
metode hanya mengubah nilai objek yang mereka panggil, sedangkan metode tanpa!
mengembalikan nilai yang dimanipulasi tanpa menulis di atas objek metode dipanggil.Hanya gunakan
!
jika Anda tidak berencana membutuhkan nilai asli yang disimpan pada variabel tempat Anda memanggil metode ini.Saya lebih suka melakukan sesuatu seperti:
ATAU
Dari pada
Kalau-kalau saya ingin mengakses nilai asli lagi.
sumber
!
bermutasi objek daripada mengembalikan salinan yang dimodifikasi.User.create!