stepan_sib
@stepan_sib
head, hands, hard working, contracts

Почему в Rails в качестве названий свойств объектов используются символы (Symbol)?

У меня есть предположение, что во многих моделях ActiveRecord могут быть одинаковые свойства, например "title" или "id", и тогда использование символов (:title, :id) для именования свойств будет экономить память. Если это так - это строгое правило или соглашение?

В Ruby и RoR я новичек, и после долгих лет с PHP и IBM Lotus я будто попал в рай) Но понимание некоторых вещей (н-р, символов и внутреннего устройства рельс) до сих пор приходит нелегко.
Благодарю за ответы.
  • Вопрос задан
  • 2480 просмотров
Решения вопроса 1
Freika
@Freika
Senior Ruby on Rails developer
Символы являют собой аналог простых строк, но отличаются от них тем, что занимают в неизменное место в памяти. То есть, если сделать хэш {'title' => 'There is no spoon'}, то 'title' каждый раз будет занимать новое место в памяти. С другой стороны, в хэше вида {title: 'There is no spoon'} символ :title будет каждый раз занимать одну и ту же позицию в памяти. Несложно сделать вывод, что использование символов экономит память при работе программы.

Пример со строкой:
2.1.5 :004 > 'title'.object_id
 => 70319227477100
2.1.5 :005 > 'title'.object_id
 => 70319227461020
2.1.5 :006 > 'title'.object_id
 => 70319227447980
2.1.5 :007 > 'title'.object_id
 => 70319227431260


Пример с символом:
2.1.5 :008 > :title.object_id
 => 1145928
2.1.5 :009 > :title.object_id
 => 1145928
2.1.5 :010 > :title.object_id
 => 1145928
2.1.5 :011 > :title.object_id
 => 1145928
2.1.5 :013 >


Конечно, различия в использовании памяти могут быть незначительными, но так уж повелось. В принципе, эту традицию можно считать соглашением. Ну и стоит упомянуть, что это соглашение оказалось настолько популярным, что в Ruby 1.9 ввели возможность писать хэши с символами в качестве ключей вот так: {key: 'value'} (до 1.9 было так: {:key => 'value'}).

P.S. Для понимания Руби читать Programming Ruby 1.9 & 2.0, для понимания Рельс -- The Rails 4 Way.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы