Jeg er helt ny i Ruby-verdenen, og jeg er lidt forvirret med begrebet symboler. Hvad er forskellen mellem symboler og variabler? Hvorfor ikke bare bruge variabler?
Tak.
Kommentarer
- i Lisp – som Ruby er afledt af – et symbol er i det væsentlige datatypen for en variabel; det betyder, at du kan manipulere programmet på en refleksionsagtig måde, når det udføres. (ikke den mest sammenhængende forklaring, undskyld)
Svar
Variabler og symboler er forskellige ting. En variabel peger på forskellige slags data. I Ruby, et symbol er mere som en streng end en variabel.
I Ruby kan en streng ændres, mens et symbol er uforanderlig. Det betyder, at der kun skal oprettes en kopi af et symbol. Så hvis du har
x = :my_str y = :my_str
:my_str
oprettes kun én gang, og x
og y
peger på det samme hukommelsesområde. På den anden side, hvis du har
x = "my_str" y = "my_str"
en streng indeholder ing my_str
oprettes to gange og x
og y
vil pege på forskellige forekomster.
Som et resultat bruges symboler ofte som svarende til enums i Ruby såvel som nøgler til en ordbog (hash).
Kommentarer
Svar
Symbol i Ruby er dybest set det samme som symbol i den virkelige verden. Det bruges til at repræsentere eller navngive noget.
Symboler bruges meget ofte til at repræsentere en slags tilstand, for eksempel
order.status = :canceled order.status = :confirmed
Dig kan også se på symbolet som øjeblikkelig enum. Du behøver ikke at definere et symbol, du skal bare bruge det. Denne artikel forklarer det i detaljer.
Kommentarer
- Bedre forklaring end de fleste jeg ' har set hidtil.
Svar
Normalt har variabler tendens til at forveksles med strenge, men jeg kan forstå, at du tænker det som en variabel. Det er forståeligt. Tænk på det på denne måde:
Status for en spiller i et spil er repræsenteret af et tal. 1 betyder levende, 2 betyder usikker, 3 betyder død. Dette kan let erstattes af symboler. Symbolerne kunne være :alive
:unsure
og :dead
. For at kontrollere, om en spiller lever i stedet for at gøre dette:
if player_status == 1
Du kan gøre dette:
if player_status == :alive
#mySymbol
.