Jaka jest różnica między ciągiem a symbolem w Ruby i kiedy należy używać jednego z nich zamiast drugiego?Jaka jest różnica między ciągiem a symbolem w Ruby?
Odpowiedz
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.
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
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.
Jako kontrapunkt, mój przyjaciel napisał ostatnio a post titled "Ruby Rant", który rzuca okiem na symbole Ruby.
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. –
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 .
Struny są zmienne, Symbole ARRE niezmienny
Uwaga: Zmienne obiekty mogą ulec zmianie po przydzieleniu natomiast niezmienne obiekty mogą tylko być nadpisane http://www.robertsosinski.com/2009/01/11/the-difference-between-ruby-symbols-and-strings/
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
Jakie są różnice między symbolami & sznurki?
- Symbole są niezmienne: ich wartość pozostaje stała.
- 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.
- 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
Istnieją dwie główne różnice między ciąg i symbol w Ruby.
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.
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ć:
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.
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
@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
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? –