2008-10-31 12 views

Odpowiedz

69

Główna różnica polega na tym, że wiele symboli reprezentujących pojedynczą wartość jest identycznych, podczas gdy nie jest to prawda w przypadku łańcuchów. Na przykład:

irb(main):007:0> :test.object_id 
=> 83618 
irb(main):008:0> :test.object_id 
=> 83618 
irb(main):009:0> :test.object_id 
=> 83618 

3 odniesienia do symbolu: test, wszystkie te same obiekty.

irb(main):010:0> "test".object_id 
=> -605770378 
irb(main):011:0> "test".object_id 
=> -605779298 
irb(main):012:0> "test".object_id 
=> -605784948 

3 odniesienia do ciągu "test", wszystkie różne obiekty.

Oznacza to, że używanie symboli może potencjalnie zaoszczędzić sporo pamięci w zależności od aplikacji. Jest również szybsze porównywanie symboli dla równości, ponieważ są one tym samym obiektem, porównywanie identycznych łańcuchów jest znacznie wolniejsze, ponieważ wartości łańcuchów muszą być porównywane zamiast tylko identyfikatorów obiektów.

Jeśli chodzi o czas, z którego używam, zwykle używam ciągów znaków do prawie wszystkiego, z wyjątkiem takich rzeczy jak klawisze skrótów, w których naprawdę chcę mieć niepowtarzalny identyfikator, a nie ciąg znaków.

+8

Chociaż symbole nie są oczyszczane przez garbage collector i pozostają w pobliżu aż do końca instancji środowiska wykonawczego. Więc jeśli zadeklarujesz wiele symboli, możesz tracić dużo pamięci. – Daemin

+5

@Dememin: Generalnie nie jest to problem, chyba że dynamicznie tworzysz symbole en-masse. Jest to przyczyną nadmiernego obciążenia pamięci w niektórych aplikacjach. Jeśli użyjesz zakodowanych symboli w swoim kodzie, jesteś względnie bezpieczny. – Pistos

+2

Nie jestem pewien, czy rozumiem twoje pierwsze zdanie. Kiedy ludzie mówią, że każdy płatek śniegu jest unikalny, oznacza to, że każdy z nich jest inny. Każde wystąpienie różni się od drugiego. Jednak w przykładowym kodzie symbolowym każde wystąpienie przedstawia dokładnie ten sam obiekt. Czy "identyczne" nie byłoby lepszym słowem? –

1

Symbol jest używany do reprezentowania nazw i ciągów znaków. Będziesz chciał użyć symbolu, gdy będziesz musiał użyć ciągu kilka razy, jako że jest to znacznie łatwiejsze i bardziej wydajne.

I po prostu znaleźć to za pośrednictwem Google, które mogą oferować bardziej szczegółowy: Here you go

0

Symbole i łańcuchy są zupełnie inne this post ma trochę wgląd różnic. Informacje o tym, kiedy i gdzie ich używać, zawierają obszerny post na ten temat pod adresem has many :through.

0

Jako kontrapunkt, mój przyjaciel napisał ostatnio a post titled "Ruby Rant", który rzuca okiem na symbole Ruby.

+0

Symbole mogą być bardzo przydatne i zapewniają lepszą wydajność niż opcje oferowane przez inne języki, ale podobnie jak prawie wszystko inne, mogą być nadużywane. Punkt 4a re: API może być dużym PITA, ale jest to w dużej mierze adresowane w Rubim 1.9, gdzie Symbole mogą być porównywane między innymi bezpośrednio z ciągami znaków. –

3

Dodatkowa różnica między String i Symbol jest to, że String ma dużo więcej metod na nim na łańcuchach, natomiast Symbol jest stosunkowo chude przedmiot.

Zapoznaj się z dokumentacją dla String class i .

0

symbol jest niezmienna i łańcuch są zmienne.

kiedy wykonujemy jakąkolwiek operację na łańcuchu, wtedy tworzy on nowy obiekt i przyjmuje memery. ponieważ wykonujemy coraz więcej operacji na łańcuchu, zużywamy coraz więcej pamięci.

symbol to obiekt, który jest niezmienny, jeśli wykonamy jakąkolwiek operację, a następnie dokonamy zmian w oryginalnym obiekcie, Nie stworzy on żadnego obiektu, dlatego jest bardziej opłacalny.

uzyskać więcej informacji, można click here

9

Jakie są różnice między symbolami & sznurki?

  1. Symbole są niezmienne: ich wartość pozostaje stała.
  2. Wiele zastosowań tego samego symbolu ma ten sam identyfikator obiektu i jest tym samym obiektem w porównaniu do łańcucha, który będzie innym obiektem z unikalnym identyfikatorem obiektu za każdym razem.
  3. Nie możesz wywołać żadnej z metod String, takich jak #upcase, #split w Symbols.

Od Understanding Differences Between Symbols & Strings in Ruby

Jeśli chińska, można również czytać 理解 Ruby Symbol

0

Istnieją dwie główne różnice między ciąg i symbol w Ruby.

  1. String jest zmienny i Symbol nie jest

    • ponieważ ciąg jest zmienny, może to być zmiana w gdzieś i może prowadzić do rezultatu, nie jest poprawna.

    • Symbol jest niezmienny.

  2. String jest obiektem tak potrzebuje alokacji pamięci

    stawia "abc" .object_id # 70322858612020

    puts "abc" .object_id # 70322846847380

    puts "abc". object_id # 70322846815460

Z drugiej strony Symbol to ty e ten sam obiekt:

puts :abc.object_id # 1147868 

puts :abc.object_id # 1147868 

puts :abc.object_id # 1147868 

Więc ciąg będzie wymagał więcej czasu i porównania niż symbol.

Możesz przeczytać więcej here aby w pełni zrozumieć:

2

Oświadczenie

foo = "bar" 

tworzy nowy obiekt w pamięci.Jeśli będziemy powtarzać oświadczenie

foo = "bar" 

Tworzymy inny obiekt

dostać to jaśniej spróbuj poniższy kod na konsoli rubinowym

foo = "bar" 
puts "string #{foo} with object id = #{foo.object_id}" 
foo = "bar" 
puts "string #{foo} with object id = #{foo.object_id}" 

dostaniesz wyjście jak

string bar with object id = 70358547221180 
string bar with object id = 70358548927060 

co wyraźnie pokazuje, że istnieją dwa różne obiekty dla tego samego ciągu znaków. Teraz, jeśli użyć symbolu stworzy jeden przedmiot za symbol tak

foo = :bar 
puts "symbol #{foo} with object id = #{foo.object_id}" 
foo = :bar 
puts "symbol #{foo} with object id = #{foo.object_id}" 

pokazuje

symbol bar with object id = 7523228 
symbol bar with object id = 7523228 

co oznacza, że ​​jest tylko jeden obiekt dla: bar

pozostałe symbole są niezmienny i nie można wywoływać żadnej z metod String, takich jak #upcase, #split w Symbolach.

Porównywanie symboli jest szybsze niż porównywanie ciągów.

Symbole mogą być traktowane jako ciągłe/niezmienne ciągi, które tworzą unikalny zestaw, które są skutecznie konwertowane na wskaźniki pamięci na stercie. Oznacza to, że porównywanie dwóch symboli jest szybkie, ponieważ porównywane są 2 liczby całkowite (wskaźniki pamięci).

Łańcuchy są zmienne, więc wskaźnik pamięci na ich wartość na stercie może się zmienić po modyfikacji. Oznacza to, że operacje porównania są wolniejsze, ponieważ mogą istnieć duplikaty, które są semantycznie równoważne.

Używa

korzystanie Symbol gdy jesteś pewien, że wartość pozostaje stała. Przykład użycia symboli dla klawiszy skrótu, użyj ciągu znaków, gdy chcesz zmienić wartość lub chcesz użyć metody łańcuchowej.