Переменные-члены класса Ruby теперь в порядке? - PullRequest
5 голосов
/ 20 февраля 2009

В мае прошлого года на Railsconf в Портленде я отправился на презентацию, где утверждалось, что в Rails переменные-члены класса Ruby, такие как @@ foo, опасны, поскольку по своей природе они не являются безопасными.

Я исследовал вопрос позже, и я так и не нашел ссылку, которая действительно раскрыла бы вопрос. Я был бы признателен за указатель на хорошую статью о Rails и потоках, которая действительно затрагивает вопрос члена класса. Также было бы неплохо узнать, как Rail 2+ и Yarv изменили ситуацию в этом направлении.

Edit:

Возможно, моя память о презентации туманна, но я помню, что у @@ foo были проблемы, выходившие за рамки обычных предупреждений о том, что доступ к любой совместно используемой переменной должен строго контролироваться. Я знаю, что в самом коде Ruby были утечки памяти, которые были исправлены некоторое время назад. Я ищу ссылки на статьи по общим переменным Ruby и многозадачности, чем глубже, тем лучше. * В настоящее время я не использую переменные класса ни для чего из-за этого, но было бы неплохо иметь возможность использовать их в определенных ситуациях.

Ответы [ 2 ]

5 голосов
/ 20 февраля 2009

Любое разделяемое изменяемое состояние по своей природе небезопасно. Вы должны заблокировать все доступы, чтобы гарантировать, что все безопасно, и гарантировать, что все возвращается. @@foo особенно плохо, потому что сложнее проверять код, потому что любой подкласс может обращаться к переменной. Rails 2+ просто «решил» проблему, проверив все и убедившись, что мьютексы и другие примитивы синхронизации используются там, где это необходимо.

1 голос
/ 20 февраля 2009

Я думаю, что они такие же нормальные, как и всегда, но их следует использовать с осторожностью в среде Rails, где класс может загружаться несколько раз (например, один раз на монгрела, если вы используете монгрел), поэтому класс переменная-член может независимо изменяться в этих процессах.

Я думаю, что в Ruby 1.9 есть изменение области видимости для @@ переменных в Ruby 1.9 *1004*, что, вероятно, следует принять во внимание - мы все будем там однажды.

Была ли у вас какая-то особая цель? Недавно я подумал, что мне нужен один, но это оказалось ошибкой в ​​моем (схематичном) понимании темы - мне действительно нужна была переменная экземпляра в классе. (Я строил модуль для расширения класса, чтобы можно было добавить некоторые декларативные макросы в стиле AR).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...