Ruby'de bir sembol nedir?


45

Ruby dünyasında tamamen yeniyim ve biraz Symbols kavramıyla karıştı. Semboller ve Değişkenler arasındaki fark nedir? Neden sadece değişken kullanmıyorsunuz?

Teşekkürler.


Ruby'nin türetildiği Lisp'te - bir sembol temelde bir değişkenin veri tipidir; Bu, programı yürütürken Yansıma-esque tarzında değiştirebileceğiniz anlamına gelir. (en tutarlı açıklama değil, üzgünüm)
Paul Nathan

Yanıtlar:


70

Değişkenler ve semboller farklı şeylerdir. Bir değişken, farklı veri türlerine işaret eder. Ruby'de, bir sembol değişkenden çok dize gibidir.

Ruby'de bir dize değişebilir, bir sembol değişmezdir. Bu, sadece bir sembolün bir kopyasının oluşturulması gerektiği anlamına gelir. Böylece, varsa

x = :my_str
y = :my_str

:my_strSadece bir kez oluşturulur ve edilecek xve ynokta belleğinin aynı bölgeye. Öte yandan, varsa

x = "my_str"
y = "my_str"

içeren bir dize my_stroluşturulur iki kez ve xve yfarklı örneklerine işaret edecektir.

Sonuç olarak, semboller genellikle Ruby'deki enums değerlerine eşdeğer olarak kullanılır, ayrıca bir sözlük (karma) için anahtarlar kullanılır.


1
Sadece @ mipadi'nin noktasını zorlamak için, bir dizgiyi karşılaştırdığınızda her karakteri birbiriyle karşılaştırmanız gerekir. Dolayısıyla, aynı dizeleri karşılaştırmak O (n) 'dir. Oysa yakut semboller nesne referanslarını karşılaştırırken cadı O (1).
Jeremy Heiler

Python'da neden bu yok?
İş

Geçen bildiğim beri de onlara aşırı için dikkatli olmalı, ama ben Yakut> 1.9 bu bakmadım, semboller gc'd alamadım ve böylece bellek kadar yiyebilir
frogstarr78

Görünüşleri dışında Smalltalk'te aynı şekilde davranırlar #mySymbol.
Frank Shearar,

@ frogstarr78 - Programlı olarak sembol üretmediğiniz sürece (önce bunları kontrol etmeden önce dizeleri yerleştirme), çok fazla sembol yapma konusunda endişelenmenize gerek yoktur.
Justin L.

16

Ruby'deki sembol temelde gerçek dünyadaki sembolle aynıdır. Bir şeyi temsil etmek veya adlandırmak için kullanılır.

Örneğin, bir tür durumu temsil etmek için simgeler çok sık kullanılır.

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

Ayrıca sembole anında enum olarak bakabilirsiniz. Bir sembol tanımlamanıza gerek yok, sadece kullanın. Bu makale, onu ayrıntılı olarak açıklar.


1
Şimdiye kadar göründüğümden daha iyi bir açıklama.
Yuri Ghensev

0

Genellikle, değişkenler dizelerle karıştırılma eğilimindedir, ancak onu bir değişken gibi düşünerek sizi anlayabilirim. Anlaşılabilir. Bu şekilde düşün:

Bir oyunda bir oyuncunun durumu bir sayı ile temsil edilir. 1 canlı, 2 ise emin değil, 3 ölü demektir. Bu kolayca sembollerle değiştirilebilir. Semboller olabilir :alive :unsureve :dead. Bir oyuncunun hayatta olup olmadığını kontrol etmek için, bunu yapmak yerine:

if player_status == 1

Bunu yapabilirsin:

if player_status == :alive

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.