Hva er et symbol i Ruby?

Jeg er helt ny i Ruby-verdenen, og jeg er litt forvirret med symbolbegrepet. Hva er forskjellen mellom symboler og variabler? Hvorfor ikke bare bruke variabler?

Takk.

Kommentarer

  • i Lisp – som Ruby er avledet av – et symbol er i det vesentlige datatypen for en variabel; det betyr at du kan manipulere programmet på en reflekterende måte når det kjøres. (ikke den mest sammenhengende forklaringen, beklager)

Svar

Variabler og symboler er forskjellige ting. En variabel peker på forskjellige typer data. I Ruby, et symbol er mer som en streng enn en variabel.

I Ruby kan en streng forandres, mens et symbol er uforanderlig. Det betyr at bare en kopi av et symbol trenger å opprettes. Dermed, hvis du har

x = :my_str y = :my_str 

:my_str blir bare opprettet en gang, og x og y peker på samme område av minnet. På den annen side, hvis du har

x = "my_str" y = "my_str" 

a streng inneholder ing my_str blir opprettet to ganger , og x og y vil peke på forskjellige forekomster.

Som et resultat blir symboler ofte brukt som ekvivalenter til enums i Ruby, samt nøkler til en ordbok (hash).

Kommentarer

  • Bare for å skyve @mipadi ' s poeng, når du sammenligner en streng, må du sammenligne hvert tegn mot hverandre. Så, å sammenligne identiske strenger er O (n). Mens rubinsymboler sammenligner objektreferanser, er heks O (1).
  • Hvorfor har ikke Python dette?
  • Du bør være forsiktig med å bruke dem også, sist jeg visste, men jeg har ikke ' t sett på dette i rubin > 1.9, symboler ikke ' t få gc ' d og kan så spise opp minne
  • De oppfører seg identisk i Smalltalk, bortsett fra at de ser ut som #mySymbol .
  • @ frogstarr78 – Med mindre du programmerer genererer symboler (interner strenger uten å sjekke dem først), trenger du ikke ' ikke trenger å bekymre deg for å lage for mange symboler.

Svar

Symbol i Ruby er i utgangspunktet det samme som symbol i den virkelige verden. Det brukes til å representere eller navngi noe.

Symboler brukes veldig ofte til å representere en slags tilstand, for eksempel

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

Du kan også se på symbol som øyeblikkelig enum. Du trenger ikke definere et symbol, du bruker det bare. Denne artikkelen forklarer det i detalj.

Kommentarer

  • Bedre forklaring enn de fleste jeg ' har synes så langt.

Svar

Vanligvis forandres variabler med strenger, men jeg kan forstå at du tenker det som en variabel. Det er forståelig. Tenk på det slik:

Statusen til en spiller i et spill er representert med et tall. 1 betyr levende, 2 betyr usikker, 3 betyr død. Dette kan lett erstattes av symboler. Symbolene kan være :alive :unsure og :dead. For å sjekke om en spiller lever, i stedet for å gjøre dette:

if player_status == 1

Du kan gjøre dette:

if player_status == :alive

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *