Apa saja contoh kasus penggunaan untuk literal simbol di Scala?

93

Penggunaan literal simbol tidak langsung jelas dari apa yang saya baca di Scala. Adakah yang mau berbagi beberapa kegunaan dunia nyata?

Apakah ada idiom Jawa tertentu yang ditutupi oleh literal simbol? Bahasa apa yang memiliki konstruksi serupa? Saya berasal dari latar belakang Python dan tidak yakin ada analogi dalam bahasa itu.

Apa yang akan memotivasi saya untuk menggunakan 'HelloWorld vs "HelloWorld"?

Terima kasih

Joe Holloway
sumber

Jawaban:

77

Dalam istilah Java, simbol adalah string yang diinternir. Ini berarti, misalnya, perbandingan persamaan referensi ( eqdi Scala dan ==Java) memberikan hasil yang sama seperti perbandingan persamaan normal ( ==di Scala dan equalsJava): 'abcd eq 'abcdakan mengembalikan nilai true, sementara "abcd" eq "abcd"mungkin tidak, bergantung pada keinginan JVM (yah, seharusnya untuk literal, tetapi tidak untuk string yang dibuat secara dinamis secara umum).

Bahasa lain yang menggunakan simbol adalah Lisp (yang menggunakan 'abcdseperti Scala), Ruby ( :abcd), Erlang dan Prolog ( abcd; mereka disebut atom, bukan simbol).

Saya akan menggunakan simbol ketika saya tidak peduli dengan struktur string dan menggunakannya murni sebagai nama untuk sesuatu. Misalnya, jika saya memiliki tabel database yang mewakili CD, yang menyertakan kolom bernama "harga", saya tidak peduli bahwa karakter kedua dalam "harga" adalah "r", atau tentang nama kolom yang digabungkan; jadi pustaka database di Scala bisa menggunakan simbol untuk nama tabel dan kolom.

Alexey Romanov
sumber
25
Mungkin perlu diingat bahwa == di Scala melakukan hal .equals, jadi perbedaannya sebenarnya adalah saat menggunakan metode "eq" yang mereferensikan persamaan. Namun, satu bonusnya adalah perbandingan antara simbol sangat murah.
Calum
@Calum, seperti perbandingan antara dua string. Java interns (kurang lebih) semua string.
Elazar Leibovich
4
@ Elazar: Apakah itu benar? Saya mendapat kesan bahwa Java hanya menyimpan literal (yaitu hampir semua string dalam contoh-contoh sepele, dan hampir tidak ada string dalam perangkat lunak produksi). Karena kasus penggunaan simbol biasanya sebagai nilai literal (saya ragu Anda sering membuatnya dari awal), jadi bisa dibilang keuntungan utama yang Anda dapatkan hanyalah tipe yang lebih deskriptif.
Calum
1
@Elazar Mereka tidak, karena Simbol dapat mengandalkan nilai mereka yang disimpan, sedangkan dengan String bersifat opsional dan dapat mengoptimalkan beberapa kasus penggunaan. Simbol lebih seperti Enum yang dibuat secara dinamis daripada apapun. Saya menguraikan ini pada jawaban yang saya tautkan dalam tanggapan terakhir saya; silahkan baca lebih lanjut.
Calum
3
Jadi, "halo, dunia!" adalah kumpulan karakter berurutan sementara 'helloWorld adalah nilai yang ramah orang-orang daripada 14392.
CW Holeman II
26

Jika Anda memiliki string biasa yang mewakili nama metode dalam kode, yang mungkin diedarkan, Anda tidak menyampaikan sesuatu dengan tepat. Ini adalah semacam masalah batas Data / Kode, tidak selalu mudah untuk menarik garis, tetapi jika kita mengatakan bahwa dalam contoh itu nama metode itu lebih banyak kode daripada data, maka kita ingin sesuatu untuk mengidentifikasi itu dengan jelas .

Symbol Literal ikut bermain di mana ia dengan jelas membedakan sembarang data string lama dengan konstruksi yang digunakan dalam kode. Itu benar-benar ada di mana Anda ingin menunjukkan, ini bukan hanya beberapa data string, tetapi pada kenyataannya di beberapa cara bagian dari kode. Idenya adalah hal-hal seperti IDE Anda akan menyorotnya secara berbeda, dan mengingat perkakasnya, Anda dapat memfaktor ulangnya, daripada melakukan penelusuran / penggantian teks.

Tautan ini membahasnya dengan cukup baik.

Saem
sumber
2
Ini adalah penjelasan yang sangat membantu. Itu membuat saya berpikir dalam hal alternatif untuk enum - yang bisa jadi kikuk
javadba
2

Python memelihara tabel global internal "string internal" dengan nama semua variabel, fungsi, modul, dll. Dengan tabel ini, penerjemah dapat melakukan pencarian dan pengoptimalan yang lebih cepat. Anda dapat memaksa proses ini dengan internfungsi ( sys.interndi python3).

Selain itu, Java dan Scala secara otomatis menggunakan "string internal" untuk pencarian yang lebih cepat. Dengan scala, Anda dapat menggunakan internmetode ini untuk memaksa bagian dalam string, tetapi proses ini tidak berfungsi dengan semua string. Simbol diuntungkan karena dijamin akan disimpan, jadi pemeriksaan persamaan referensi tunggal sudah cukup untuk membuktikan persamaan atau ketidaksetaraan.

ChemaCortes
sumber