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.


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).


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.


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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.