Jestem zupełnie nowy w świecie Ruby i jestem trochę zdezorientowany z koncepcją symboli. Jaka jest różnica między symbolami a zmiennymi? Dlaczego po prostu nie używać zmiennych?
Dzięki.
Komentarze
- w Lispie – od którego pochodzi 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 wyjaśnienie, przepraszam)
Odpowiedź
Zmienne i symbole to różne rzeczy. Zmienna wskazuje na różne rodzaje danych. W Rubim symbol bardziej przypomina łańcuch niż zmienną.
W Rubim łańcuch jest zmienny, podczas gdy symbol jest niezmienny. Oznacza to, że wystarczy utworzyć tylko jedną kopię symbolu. mieć
x = :my_str y = :my_str
:my_str
zostanie utworzony tylko raz, a x
i y
wskazują na ten sam obszar pamięci. Z drugiej strony, jeśli masz
x = "my_str" y = "my_str"
a ciąg zawiera ing my_str
zostanie utworzony dwukrotnie , a x
i y
wskaże różne instancje.
W rezultacie symbole są często używane jako odpowiedniki wyliczeń w Rubim, a także klucze do słownika (hash).
Komentarze
- Po prostu aby wypchnąć @mipadi ' punkt, kiedy porównujesz ciąg, musisz porównać ze sobą każdy znak. 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).
- Dlaczego Python tego nie ma?
- Powinieneś uważać, aby ich również nie nadużywać, ponieważ ostatnio wiedziałem, ale nie ' nie zajrzałem do tego w Rubim > 1.9, symbole nie ' t get gc ' d, więc może pochłonąć pamięć
- Zachowują się identycznie w Smalltalk, z wyjątkiem tego, że wyglądają jak
#mySymbol
. - @ frogstarr78 – O ile nie generujesz symboli w sposób programowy (umieszczasz ciągi znaków bez ich uprzedniego sprawdzania), nie ' nie musisz się martwić o utworzenie zbyt wielu symboli.
Odpowiedź
Symbol w Rubim jest w zasadzie tym samym, co symbol w prawdziwym świecie. Służy do reprezentowania lub nazywania czegoś.
Symbole są bardzo często używane do reprezentowania pewnego rodzaju stanu, na przykład
order.status = :canceled order.status = :confirmed
może również patrzeć na symbol jako natychmiastowe wyliczenie. Nie musisz definiować symbolu, po prostu go używasz. Ten artykuł wyjaśnia to szczegółowo.
Komentarze
- Lepsze wyjaśnienie niż większość, do tej pory '.
Odpowiedź
Zwykle zmienne są mylone z ciągami znaków, ale rozumiem, że myślisz o nich jak o zmiennej. To zrozumiałe. Pomyśl o tym w ten sposób:
Status gracza w grze jest reprezentowany przez liczbę. 1 oznacza żywy, 2 oznacza niepewność, 3 oznacza śmierć. Można to łatwo zastąpić symbolami. Symbolami mogą być :alive
:unsure
i :dead
. Aby sprawdzić, czy gracz żyje, zamiast robić to:
if player_status == 1
Możesz to zrobić:
if player_status == :alive