Hvad er et symbol i Ruby?

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

  • Bare for at skubbe @mipadi ' s punkt, når du sammenligner en streng, skal du sammenligne hvert tegn mod hinanden. Så sammenligning af identiske strenge er O (n). Mens rubinsymboler sammenligner objektreferencer, heks er O (1).
  • Hvorfor har Python ikke dette?
  • Du skal være forsigtig med ikke at overforbruge dem også, da sidst vidste jeg men jeg har ikke ' t kigget på dette i rubin > 1.9, symboler don ' t få gc ' d og kan så spise hukommelse
  • De opfører sig identisk i Smalltalk, bortset fra at de ligner #mySymbol .
  • @ frogstarr78 – Medmindre du programmatisk genererer symboler (interningstrenge uden at kontrollere dem først), behøver du ikke ' behøver ikke bekymre dig om at lave for mange symboler.

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

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *