Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

In Ruby, should I use ||= or if defined? for memoization?

Should I use if defined?

 return @current_user_session if defined?(@current_user_session)
 @current_user_session = UserSession.find

Or ||=

@current_user_session ||= UserSession.find

I noticed the if defined? method being used more and more recently. Is there any advantage to one over the other? Personally, I prefer ||= for readability. I also think Rails might have a memoize macro which provides this behavior transparently. Is this the case?

like image 468
Kris Avatar asked Jun 08 '09 08:06

Kris


2 Answers

Rails does have memoization, check out the screencast below for a great introduction:

http://railscasts.com/episodes/137-memoization

class Product < ActiveRecord::Base
  extend ActiveSupport::Memoizable

  belongs_to :category

  def filesize(num = 1)
    # some expensive operation
    sleep 2
    12345789 * num
  end

  memoize :filesize
end
like image 45
mwilliams Avatar answered Sep 21 '22 18:09

mwilliams


Be careful: x ||= y assigns x = y if x returns false. That may mean that x is undefined, nil, or false.

There are many times variables will be defined and false, though perhaps not in the context of the @current_user_session instance variable.

If you desire conciseness, try the conditional construct:

defined?(@current_user_session) ?
    @current_user_session : @current_user_session = UserSession.find

or just:

defined?(@current_user_session) || @current_user_session = UserSession.find

if you just need to initialize the variable.

like image 141
guns Avatar answered Sep 22 '22 18:09

guns