Co to jest symbol w Rubim?

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

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *