Ketika saya mengatakan { :bla => 1, :bloop => 2 }
, apa sebenarnya yang :
harus dilakukan? Saya membaca di suatu tempat tentang bagaimana itu mirip dengan string, tetapi entah bagaimana simbol.
Saya tidak terlalu jernih pada konsepnya, bisakah seseorang mencerahkan saya?
Jawaban:
:foo
adalah simbol bernama "foo". Simbol memiliki fitur berbeda yang mana dua simbol dengan nama yang sama akan identik:Ini membuat membandingkan dua simbol sangat cepat (karena hanya perbandingan pointer yang terlibat, dibandingkan dengan membandingkan semua karakter seperti yang Anda lakukan dalam string), ditambah Anda tidak akan memiliki miliaran salinan simbol yang sama melayang-layang.
Juga, tidak seperti string, simbol tidak dapat diubah.
sumber
"foo".equal? "foo"
salah? b) Dapatkah Anda merujuk pada simbol di mana saja, pada dasarnya menjadikannya seperti variabel global?equal?
di Ruby melakukan perbandingan identitas. Setiap string literal, seperti"foo"
, membuat instance string baru. Ini berfungsi seperti itu karena string di Ruby bisa berubah. 2. Simbol bersifat global, tetapi lebih mirip konstanta global daripada variabel global, karena simbol tidak memiliki status. Jadi, menggunakan simbol bukanlah antipengganti dalam cara variabel global."foo" == "foo"
# => trueHanya untuk menunjukkan beberapa hal yang disebutkan dalam jawaban:
Menjalankannya menghasilkan:
Jadi, membandingkan string ke string menggunakan
equal?
gagal karena mereka objek yang berbeda, bahkan jika mereka konten yang sama.==
membandingkan konten, dan pemeriksaan setara dengan simbol jauh lebih cepat.Kedua tes simbol pada dasarnya sama sejauh kecepatan. Setelah 1.000.000 iterasi hanya ada perbedaan 0,004733 detik, jadi saya akan mengatakan itu adalah mencuci yang digunakan.
sumber
==
lebih cepat daripada.equal?
perbandingan string dan simbol. Perbandingan simbol menghasilkan 3+ kali lebih cepat dari perbandingan string.Simbol adalah cara untuk mewakili string dan nama dalam ruby.
Perbedaan utama antara simbol dan string adalah bahwa simbol dengan nama yang sama diinisialisasi dan ada di memori hanya sekali selama sesi ruby.
Mereka berguna ketika Anda perlu menggunakan kata yang sama untuk mewakili hal-hal yang berbeda
sumber
Ada beberapa kutipan dari buku terkenal Agile Web Development with Rails , yang mungkin membantu untuk memahami simbol juga:
sumber
Dalam ruby, setiap objek memiliki pengenal objek yang unik, jika Anda menulis
puts "hello".object_id
di irb dan menekan return untuk 2 kali yang berbeda, Anda akan mendapatkan 2 nilai pengembalian yang berbeda, tetapi jika Anda menulis:hello.object_id
2 kali Anda hanya akan mendapatkan nilai pengembalian yang sama. Itu seharusnya menjelaskan perbedaannya.sumber
Jika Anda menggunakan
:foo => bar
, foo akan menjadi simbol. Manfaat simbol adalah unik. Ketika Anda memanggil item dalam hash, Anda lakukanhash[:foo]
.Simbol membutuhkan lebih sedikit memori daripada string, yang juga membuatnya berguna jika Anda ingin membuat program Anda sedikit lebih cepat.
sumber
Itu simbol. Pada dasarnya, Anda mengatakan bahwa dua elemen hash memiliki kunci
bla
danbloop
, seolah-olah Anda telah menggunakan string"bla"
dan"bloop"
. Namun, mereka mengambil lebih sedikit memori daripada string dan lebih mudah untuk mengetik.sumber
Semua jawaban ini menghilangkan satu detail ekstra yang menggiurkan .. jika Anda merangkai simbol: foo, Anda dapatkan .. tebak apa .. string "foo". Karenanya
Karenanya .. untuk programmer Perl .. itu jawaban Ruby untuk 'kata kosong'.
sumber
Jika Anda terbiasa dengan Java, Anda mungkin menyadari bahwa String di Java tidak dapat diubah. Simbol serupa dalam arti itu di Ruby. Mereka tidak berubah, yaitu, sejumlah kejadian simbol tertentu
:symbol
akan memetakan hanya ke satu alamat memori. Dan, karenanya, disarankan untuk menggunakan simbol sedapat mungkin karena mengoptimalkan penggunaan memori.sumber
NSString
. Akan"foo"
selalu ada yang sama dengan"foo"
, karena string internal yang sama hanya ditunjukkan. Namun, jawabannya tetap membingungkan.