Scala'daki sembol değişmezleri için bazı örnek kullanım durumları nelerdir?


93

Sembol değişmezlerinin kullanımı Scala'da okuduklarımdan hemen anlaşılmıyor. Gerçek dünyadaki bazı kullanımları paylaşmak isteyen var mı?

Sembol değişmezleri tarafından kapsanan belirli bir Java deyimi var mı? Hangi dillerin benzer yapıları vardır? Bir Python geçmişinden geliyorum ve bu dilde benzer bir şey olup olmadığından emin değilim.

Beni 'HelloWorld vs "HelloWorld" kullanmaya motive eden şey nedir?

Teşekkürler

Yanıtlar:


77

Java terimlerinde, semboller dahili dizelerdir. Bu, örneğin, referans eşitlik karşılaştırmasının ( eqScala ve ==Java'da) normal eşitlik karşılaştırması ile aynı sonucu verdiği anlamına gelir ( ==Scala ve equalsJava'da): JVM'nin kaprislerine bağlı olarak 'abcd eq 'abcddoğru, ancak "abcd" eq "abcd"olmayabilir değişmez değerler için, ancak genel olarak dinamik olarak oluşturulan dizeler için değil).

Sembolleri kullanan diğer diller Lisp ( 'abcdScala gibi), Ruby ( :abcd), Erlang ve Prolog'dur ( abcdbunlar sembol yerine atom olarak adlandırılır).

Bir dizginin yapısını önemsemediğimde ve onu sadece bir şey için isim olarak kullandığımda bir sembol kullanırdım. Örneğin, "fiyat" adlı bir sütun içeren, CD'leri temsil eden bir veritabanı tablom varsa, "fiyat" daki ikinci karakterin "r" olması veya sütun adlarının birleştirilmesi umurumda değil; bu nedenle Scala'daki bir veritabanı kitaplığı, tablo ve sütun adları için makul şekilde semboller kullanabilir.


25
Muhtemelen Scala'da =='nin .equals olayını yaptığını hatırlamakta fayda var, bu nedenle gerçekten fark, eşitliği referans alan "eq" yöntemini kullanırken olacaktır. Yine de bir bonus, semboller arasındaki karşılaştırmanın son derece ucuz olmasıdır.
Calum

@Calum, iki dizge arasındaki karşılaştırma. Java stajyerleri (aşağı yukarı) tüm dizeler.
Elazar Leibovich

4
@Elazar: Bu gerçekten doğru mu? Java'nın sadece değişmez değerleri (yani önemsiz örneklerdeki hemen hemen tüm dizgeleri ve üretim yazılımında hemen hemen hiç dizgeyi içermediği) bir izlenim edindim. Sembollerin kullanım durumlarının genellikle gerçek değerler olduğunu söylemiştim (onları genellikle sıfırdan oluşturduğunuzu sanmıyorum), bu nedenle muhtemelen elde ettiğiniz ana avantaj daha açıklayıcı bir tür.
Calum

1
@Elazar Değiller, çünkü Semboller değerlerinin dahil edilmesine güvenebilir, oysa Strings ile isteğe bağlıdır ve bazı kullanım durumlarını optimize edebilir. Semboller, her şeyden çok dinamik olarak oluşturulmuş Enum'lara benzer. Son cevabımda bağlantı kurduğum cevapta bunu detaylandırdım; daha fazlası için lütfen okuyun.
Calum

3
Öyleyse, "merhaba dünya!" sıralı bir karakter koleksiyonudur ve 'merhabaDünya, 14392'den çok insan dostu bir değerdir.
CW Holeman II

26

Kodda yöntem adlarını temsil eden düz dizeleriniz varsa, belki de etrafta dolaşırsanız, her şeyi uygun şekilde aktarmıyorsunuzdur. Bu bir tür Veri / Kod sınır sorunudur, çizgiyi çizmek her zaman kolay değildir, ancak bu örnekte bu yöntem adlarının veriden çok kod olduğunu söyleyecek olursak, o zaman bunu açıkça tanımlayacak bir şey isteriz. .

Bir Symbol Literal, kodda kullanılan bir yapı ile herhangi bir eski dize verisini açıkça ayırt ettiği yerde devreye girer. Sadece gerçekten belirtmek istediğiniz yerdedir, bu sadece bir dizi veri değil, aslında bir şekilde kodun bir parçasıdır. IDE'niz gibi şeyler olma fikri onu farklı bir şekilde vurgular ve araçlar verildiğinde, metin arama / değiştirme yapmak yerine bunlar üzerinde yeniden düzenleme yapabilirsiniz.

Bu bağlantı bunu oldukça iyi tartışıyor.


2
Bu, yararlı bir açıklamadır. Beni numaralandırmaya alternatifler açısından düşündürüyor - ki bu sakar olabilir
StephenBoesch

2

Python , tüm değişkenlerin, işlevlerin, modüllerin, vb. Adlarıyla " iç içe geçmiş dizelerin" dahili bir genel tablosunu korur . Bu tabloyla, yorumlayıcı daha hızlı arama ve optimizasyonlar yapabilir. Bu işlemi internişlevle ( sys.internpython3'te) zorlayabilirsiniz.

Ayrıca, Java ve Scala daha hızlı aramalar için otomatik olarak "dahili dizeleri" kullanır. Scala ile, internbir dizenin internini zorlamak için yöntemi kullanabilirsiniz , ancak bu işlem tüm dizelerle çalışmaz. Semboller, stajyerlik garantisinden yararlanır, bu nedenle tek bir referans eşitlik kontrolü, eşitliği veya eşitsizliği kanıtlamak için yeterlidir.


1

Not: Symbolskullanımdan kaldırılacak ve ardından Scala 3'te (dotty) kaldırılacaktır.

Referans: http://dotty.epfl.ch/docs/reference/dropped-features/symlits.html

Bu nedenle kişisel olarak Symbolsartık kullanmamanızı tavsiye ediyorum (en azından yeni scala kodunda). Dotty belgelerinde belirtildiği gibi:

Sembol değişmez değerleri artık desteklenmiyor

bunun yerine düz dize hazır bilgisi [...] kullanılması önerilir


1
Bu soruyu 11 yıl önce gönderdiğim için çılgınca. Takip için teşekkürler
Joe Holloway
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.