Jsem ve světě Ruby úplně nový a jsem trochu zmatený konceptem Symbolů. Jaký je rozdíl mezi symboly a proměnnými? Proč nepoužívat pouze proměnné?
Díky.
Komentáře
- v Lispu – od kterého je Ruby odvozen – symbol je v podstatě datový typ proměnné; to znamená, že s programem můžete při jeho provádění manipulovat způsobem reflexe. (ne nejrozumnější vysvětlení, omlouvám se)
Odpověď
Proměnné a symboly jsou různé věci. Proměnná ukazuje na různé druhy dat. V Ruby, symbol je spíše jako řetězec než proměnná.
V Ruby je řetězec proměnlivý, zatímco symbol je neměnný. To znamená, že je třeba vytvořit pouze jednu kopii symbolu. Pokud tedy mít
x = :my_str y = :my_str
:my_str
bude vytvořen pouze jednou a x
a y
ukazují na stejnou oblast paměti. Na druhou stranu, pokud máte
x = "my_str" y = "my_str"
a řetězec obsahuje ing my_str
bude vytvořen dvakrát a x
a y
bude ukazovat na různé instance.
Výsledkem je, že symboly jsou často používány jako ekvivalent enumů v Ruby, stejně jako klíče ke slovníku (hash).
Komentáře
- Stačí posunout bod @mipadi ', když porovnáváte řetězec, musíte porovnávat každý znak proti sobě. Porovnání identických řetězců je tedy O (n). Zatímco rubínové symboly porovnávají odkazy na objekty, jejichž hodnota je O (1).
- Proč to Python nemá?
- Měli byste dávat pozor, abyste je také příliš nepoužívali, protože jsem věděl, ale ' t jsem se na to nedíval v ruby > 1.9, symboly don ' t získejte gc ' d, a tak může sníst paměť
- Chovají se shodně v Smalltalku, až na to, že vypadají jako
#mySymbol
. - @ frogstarr78 – Pokud nevytváříte programově symboly (vkládání řetězců, aniž byste je nejprve zkontrolovali), nemusíte se ' starat o výrobu příliš mnoha symbolů.
Odpověď
Symbol v Ruby je v podstatě to samé jako symbol v reálném světě. Používá se k reprezentaci nebo pojmenování něčeho.
Symboly se velmi často používají k reprezentaci nějakého druhu stavu, například
order.status = :canceled order.status = :confirmed
se také může na symbol dívat jako na okamžité výčet. Není nutné definovat symbol, stačí jej použít. Tento článek to vysvětluje velmi podrobně.
Komentáře
- Lepší vysvětlení než většina, jaké se mi zatím ' zdá.
odpověď
Obvykle jsou proměnné obvykle zaměňovány s řetězci, ale rozumím tomu, že si to myslíte jako proměnnou. Je to pochopitelné. Přemýšlejte o tom takto:
Stav hráče ve hře je reprezentován číslem. 1 znamená naživu, 2 znamená nejistý, 3 znamená mrtvý. To lze snadno nahradit symboly. Symboly mohou být :alive
:unsure
a :dead
. Chcete-li zkontrolovat, zda je hráč naživu, místo toho:
if player_status == 1
Můžete to udělat:
if player_status == :alive