Apa yang dimaksud dengan simbol di Ruby?

45

Saya benar-benar baru di dunia Ruby, dan saya agak bingung dengan konsep Simbol. Apa perbedaan antara Simbol dan Variabel? Kenapa tidak menggunakan variabel saja?

Terima kasih.

wassimans
sumber
di Lisp - dari mana Ruby berasal - simbol pada dasarnya adalah tipe data untuk variabel; itu berarti Anda dapat memanipulasi program dengan cara Reflection-esque saat dijalankan. (bukan penjelasan yang paling masuk akal, maaf)
Paul Nathan

Jawaban:

70

Variabel dan simbol adalah hal yang berbeda. Variabel menunjuk ke berbagai jenis data. Di Ruby, simbol lebih seperti string daripada variabel.

Di Ruby, string dapat berubah, sedangkan simbol tidak berubah. Itu berarti bahwa hanya satu salinan simbol yang perlu dibuat. Jadi, jika sudah

x = :my_str
y = :my_str

:my_strhanya akan dibuat sekali, dan xdan yarahkan ke area memori yang sama. Di sisi lain, jika Anda punya

x = "my_str"
y = "my_str"

string yang berisi my_strakan dibuat dua kali , dan xdan yakan menunjuk ke instance yang berbeda.

Akibatnya, simbol sering digunakan sebagai setara dengan enums di Ruby, serta kunci ke kamus (hash).

mipadi
sumber
1
Hanya untuk menekan titik @ mipadi, ketika Anda membandingkan string, Anda harus membandingkan setiap karakter satu sama lain. Jadi, membandingkan string identik adalah O (n). Sedangkan simbol ruby ​​membandingkan referensi objek penyihir adalah O (1).
Jeremy Heiler
Mengapa Python tidak memilikinya?
Ayub
Anda harus berhati-hati untuk tidak terlalu sering menggunakan mereka, karena, terakhir saya tahu, tapi saya belum melihat ini di ruby> 1.9, simbol tidak mendapatkan gc'd dan bisa memakan memori
frogstarr78
Mereka berperilaku identik dalam Smalltalk, kecuali mereka terlihat seperti #mySymbol.
Frank Shearar
@ frogstarr78 - Kecuali Anda secara sistematis menghasilkan simbol (menginternir string tanpa memeriksanya terlebih dahulu), Anda tidak perlu khawatir membuat terlalu banyak simbol.
Justin L.
16

Simbol di Ruby pada dasarnya sama dengan simbol di dunia nyata. Ini digunakan untuk mewakili atau memberi nama sesuatu.

Simbol sangat umum digunakan untuk mewakili semacam keadaan, misalnya

order.status = :canceled
order.status = :confirmed

Anda juga dapat melihat simbol sebagai enum instan. Anda tidak perlu mendefinisikan simbol, cukup gunakan saja. Artikel ini menjelaskannya dengan sangat rinci.

Jakub Arnold
sumber
1
Penjelasan yang lebih baik daripada kebanyakan saya tampaknya sejauh ini.
Yuri Ghensev
0

Biasanya, variabel cenderung bingung dengan string, tapi saya bisa mengerti Anda berpikir itu seperti variabel. Itu bisa dimengerti. Pikirkan seperti ini:

Status pemain dalam permainan diwakili oleh angka. 1 berarti hidup, 2 berarti tidak yakin, 3 berarti mati. Ini dapat dengan mudah diganti dengan simbol. Simbol bisa :alive :unsuredan :dead. Untuk memeriksa apakah seorang pemain masih hidup, alih-alih melakukan ini:

if player_status == 1

Anda bisa melakukan ini:

if player_status == :alive

paksnow
sumber