Создает ли этот код круговую ссылку на память в Ruby? - PullRequest
3 голосов
/ 04 ноября 2011

У меня есть следующий гипотетический код:

class User < ActiveRecord::Base
  def oauth_consumer
    @oauth_consumer ||= OauthConsumer.new(self)
  end
end

class OauthConsumer
  attr_reader :user, :access_token

  def initialize(user)
    @user = user
    @access_token = OAuth::AccessToken.new(@user.token, @user.secret)
  end

  def get_posts_in_thread(thread_id)
    response = access_token.get("/thread/#{thread_id}/user/#{user.id}")
    JSON.parse(response.body)
  end
end

user = User.new(:token => 'token', :secret => 'secret')

# I want to get the user's posts in thread #12345.
user.oauth_consumer.get_posts_in_thread(12345)

Мне интересно, если это создает циклическую ссылку на память, в которой user имеет ссылку на oauth_consumer, а oauth_consumer имеет ссылку на user, что делает невозможным сбор мусора

Или базовая реализация GC (REE 1.8.7) обрабатывает этот случай?

1 Ответ

2 голосов
/ 07 ноября 2011

Следующее обсуждение предполагает, что аппроксимация Ruby GC (mark и sweep) справляется с циклическими ссылками:

http://www.ruby -forum.com / тема / 85717

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