Terkadang saya melihat metode di Ruby yang memiliki "?" dan "!" pada akhirnya, misalnya:
name = "sample_string"
name.reverse
name.reverse!
name.is_binary_data?
Saya bertanya-tanya apa tujuan mereka? Apakah mereka hanya melakukan pelapisan gula sintaks?
Jawaban:
Ini "hanya lapisan gula" agar terbaca, tetapi mereka memiliki arti yang sama:
!
melakukan beberapa perubahan permanen atau berpotensi berbahaya ; sebagai contoh:Enumerable#sort
mengembalikan versi objek yang diurutkan sambilEnumerable#sort!
mengurutkannya di tempatnya.ActiveRecord::Base#save
mengembalikan false jika penyimpanan gagal, sementaraActiveRecord::Base#save!
memunculkan pengecualian.Kernel::exit
menyebabkan skrip keluar, sementaraKernel::exit!
melakukannya segera, melewati penangan keluar apa pun.?
mengembalikan boolean , yang membuat aliran kode menjadi lebih intuitif seperti kalimat -if number.zero?
dibaca seperti "jika angkanya nol", tetapiif number.zero
terlihat aneh.Dalam contoh Anda,
name.reverse
mengevaluasi ke string terbalik, tetapi hanya setelahname.reverse!
barisname
variabel benar-benar berisi nama terbalik.name.is_binary_data?
Sepertinya "apakahname
data biner?".sumber
Array#clear
, misalnya. Ini menghapus array. Menghapus array secara alami akan memutasinya. Tidak ada yang mengejutkan tentang itu, namanya sudah menjelaskan, oleh karena itu: tidak ada ledakan. Lihat ruby-forum.com/topic/176830#773946 .Tanda tanya menunjukkan bahwa metode tersebut mengembalikan boolean. Sudah dijawab disini:
Apa arti operator tanda tanya di Ruby?
Ledakan menunjukkan bahwa metode tersebut bekerja pada objek itu sendiri. Sudah dijawab disini:
Mengapa tanda seru digunakan dalam metode Ruby?
sumber
Di Ruby,
?
artinya metode tersebut akan mengembalikan boolean dan!
memodifikasi objek yang dipanggil. Mereka ada untuk meningkatkan keterbacaan saat melihat kode.sumber
Berbeda dengan - saya kira - mayoritas bahasa pemrograman ...
Dari: http://www.ruby-lang.org/en/documentation/ruby-from-other-languages/ , Nama metode Bagian Lucu
sumber
?
disebut metode predikat.Hati-hati, ini tidak selalu terjadi. Ambil contoh, Ruby Array # concat http://docs.ruby-lang.org/en/2.0.0/Array.html#method-i-concat .
Di mana Anda bisa terbakar parah adalah sesuatu seperti
MyActiveRecordModel.column_names.concat([url])
. Panggilan selanjutnya yang terkait dengan MyActiveRecordModel akan mencoba mencari kolom 'url' untuk MyActiveRecordModel dan melempar.Sebagai gantinya, Anda harus mengkloningnya sebelum melakukan concat. Untungnya test suite saya menangkap yang ini, tapi .. perhatian!
sumber