Co to jest symbol w Ruby?

45

Jestem zupełnie nowy w świecie Ruby i jestem trochę zdezorientowany pojęciem Symboli. Jaka jest różnica między symbolami a zmiennymi? Dlaczego nie użyć tylko zmiennych?

Dzięki.

wassimans
źródło
w Lisp - z którego wywodzi się Ruby - symbol jest zasadniczo typem danych dla zmiennej; oznacza to, że możesz manipulować programem w sposób przypominający odbicie podczas jego wykonywania. (nie jest to najbardziej spójne wytłumaczenie, przepraszam)
Paul Nathan

Odpowiedzi:

70

Zmienne i symbole to różne rzeczy. Zmienna wskazuje na różnego rodzaju dane. W Ruby symbol jest bardziej ciągiem niż zmienną.

W Ruby ciąg znaków jest zmienny, a symbol jest niezmienny. Oznacza to, że należy utworzyć tylko jedną kopię symbolu. Tak więc, jeśli masz

x = :my_str
y = :my_str

:my_strzostanie utworzony tylko raz xi ywskaże ten sam obszar pamięci. Z drugiej strony, jeśli masz

x = "my_str"
y = "my_str"

łańcuch zawierający my_strzostaną utworzone dwa razy , a xi ybędzie wskazywać na różnych przypadkach.

W rezultacie symbole są często używane jako odpowiedniki wyliczeń w Rubim, a także klucze do słownika (skrótu).

mipadi
źródło
1
Wystarczy nacisnąć punkt @ mipadi, kiedy porównujesz ciąg, musisz porównać każdą postać ze sobą. Zatem porównywanie identycznych ciągów to O (n). Podczas gdy symbole ruby ​​porównują odniesienia do obiektów, które to O (1).
Jeremy Heiler,
Dlaczego Python tego nie ma?
Job
Powinieneś również uważać, aby ich nie nadużywać, ponieważ, jak ostatnio wiedziałem, ale nie zaglądałem do tego w Ruby> 1.9, symbole nie są wyświetlane i dlatego mogą pochłonąć pamięć
frogstarr78
Zachowują się identycznie w Smalltalk, tyle że wyglądają #mySymbol.
Frank Shearar,
@ frogstarr78 - O ile programowo nie generujesz symboli (internowanie ciągów bez uprzedniego ich sprawdzenia), nie musisz się martwić, że utworzysz zbyt wiele symboli.
Justin L.
16

Symbol w Ruby jest w zasadzie tym samym, co symbol w prawdziwym świecie. Służy do reprezentowania lub nazwania czegoś.

Symbole są bardzo często używane do reprezentowania pewnego rodzaju stanu, na przykład

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

Możesz także spojrzeć na symbol jako natychmiastowe wyliczenie. Nie musisz definiować symbolu, wystarczy go użyć. W tym artykule szczegółowo to wyjaśniono.

Jakub Arnold
źródło
1
Lepsze wytłumaczenie niż większość do tej pory wydawało mi się.
Jurij Ghensev,
0

Zwykle zmienne są mylone z ciągami, ale rozumiem, że myślisz o tym jak o zmiennej. To jest do zrozumienia. Pomyśl o tym w ten sposób:

Status gracza w grze jest reprezentowany przez liczbę. 1 oznacza żywego, 2 oznacza niepewnego, 3 oznacza martwego. Można to łatwo zastąpić symbolami. Symbole mogą być :alive :unsurei :dead. Aby sprawdzić, czy gracz żyje, zamiast tego:

if player_status == 1

Możesz to zrobić:

if player_status == :alive

Sirsnow
źródło