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?
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).
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
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:
Odpowiedzi:
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
:my_str
zostanie utworzony tylko razx
iy
wskaże ten sam obszar pamięci. Z drugiej strony, jeśli maszłańcuch zawierający
my_str
zostaną utworzone dwa razy , ax
iy
bę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).
źródło
#mySymbol
.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
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.
źródło
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
:unsure
i:dead
. Aby sprawdzić, czy gracz żyje, zamiast tego:if player_status == 1
Możesz to zrobić:
if player_status == :alive
źródło