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==
|