Ruby FAQ: различия между версиями

Содержимое удалено Содержимое добавлено
переносы →‎Кодировки
Строка 147:
 
===Что такое символы? или :wtf ===
 
Лучшее объяснение:
http://www.randomhacks.net/articles/2007/01/20/13-ways-of-looking-at-a-ruby-symbol
 
Русскоязычный комментарий к нему:
 
* Символ — это не строка. Это «число с именем».
* Наиболее корректное ''понимание'' символа на низком уровне — автоматический enum в Си.
 
'''Утечка памяти'''
 
Символы в Руби не собираются мусорщиком, т.к. одни и те же имена должны иметь одни и те же значения в течение всего времени работы программы.
 
Можно превращать символы в строки ('''инспектировать символ'''):
 
sym = :something
sym.class # => Symbol
sym.to_s # => "something"
sym.to_s.class # => String
 
* Здесь вы создаете объект класса String, который будет уничтожен мусорщиком.
 
Можно превращать строки в символы ('''генерировать символ'''):
 
str = "something"
str.class # => String
str.intern # => :something
str.intern.class # => Symbol
 
* Здесь вы создаете объект класса Symbol, который '''не будет''' уничтожен мусорщиком.
 
'''Общее правило:''' никогда не превращать вводимые пользователем строки в символы.
'''Возможная атака:''' в приложение вводят различные строки, которые превращаются в символы. Расход памяти растет. При достижении максимального числа символов (приблизительно 2 млрд), происходит bus error или segmentation fault.
 
# try it in irb and wait for death or giant swap
loop { rand.to_s.intern }
 
==Ruby on Rails==