Jag är helt ny i Ruby-världen och jag är lite förvirrad med begreppet symboler. Vad är skillnaden mellan symboler och variabler? Varför inte bara använda variabler?
Tack.
Kommentarer
- i Lisp – vilken Ruby härstammar från – en symbol är i huvudsak datatypen för en variabel; det betyder att du kan manipulera programmet på ett reflektionslikt sätt när det körs. (inte den mest sammanhängande förklaringen, sorry)
Svar
Variabler och symboler är olika saker. En variabel pekar på olika typer av data. I Ruby, en symbol är mer som en sträng än en variabel.
I Ruby kan en sträng ändras, medan en symbol är oföränderlig. Det betyder att endast en kopia av en symbol behöver skapas. Om du har
x = :my_str y = :my_str
:my_str
skapas bara en gång och x
och y
pekar på samma minnesområde. Å andra sidan om du har
x = "my_str" y = "my_str"
en sträng innehålla ing my_str
skapas två gånger och x
och y
kommer att peka på olika instanser.
Som ett resultat används symboler ofta som motsvarande enum i Ruby, liksom nycklar till en ordbok (hash).
Kommentarer
- Bara för att trycka på @mipadi ' s punkt, när du jämför en sträng måste du jämföra varje tecken mot varandra. Så att jämföra identiska strängar är O (n). Medan rubinsymboler jämför objektreferenser häxan är O (1).
- Varför har inte Python detta?
- Du bör vara noga med att inte överanvända dem också, eftersom jag senast visste, men jag har inte ' inte tittat på detta i rubin > 1.9, symboler inte ' t få gc ' d och kan så äta upp minne
- De beter sig identiskt i Smalltalk, förutom att de ser ut som
#mySymbol
. - @ frogstarr78 – Om du inte genererar symboliskt program (strängar utan att kontrollera dem först) behöver du inte ' oroa dig för att göra för många symboler.
Svar
Symbol i Ruby är i princip samma sak som symbol i verkliga världen. Det används för att representera eller namnge något.
Symboler används mycket ofta för att representera någon form av tillstånd, till exempel
order.status = :canceled order.status = :confirmed
Du kan också se på symbolen som omedelbar enum. Du behöver inte definiera en symbol, du använder den bara. Den här artikeln förklarar den i detalj.
Kommentarer
- Bättre förklaring än de flesta jag ' Jag har hittills verkat.
Svar
Normalt brukar variabler förväxlas med strängar, men jag kan förstå att du tänker det som en variabel. Det är förståeligt. Tänk på det här:
Status för en spelare i ett spel representeras av ett nummer. 1 betyder levande, 2 betyder osäker, 3 betyder död. Detta kan enkelt ersättas med symboler. Symbolerna kan vara :alive
:unsure
och :dead
. För att kontrollera om en spelare lever, istället för att göra detta:
if player_status == 1
Du kan göra detta:
if player_status == :alive