explanation of method

hey i have a method

   def admin_login_required
      username, passwd = get_auth_data
      self.current_user ||= User.authenticate(username, passwd)

:false if username && passwd

      logged_in? && authorized? ? true : access_denied
   end

this is from an authentication plugin. i cant make sense of it, and
dont understand wot the '||=' symbol does. i cant google for it, cos
google strips the search for the symbol. can someone explain step by
step wot the function is doing ?

This is a ruby question so probably better suited to other places, but anyway,
for most operators
a op= b is the same as a = a op b
So a ||= b is the same a = a || b
Because of the way ruby evaluates these things, it means set a to b unless a is already set (in which case it won't even evaluate b).

Fred

Hi --

hey i have a method

  def admin_login_required
     username, passwd = get_auth_data
     self.current_user ||= User.authenticate(username, passwd)
>> :false if username && passwd
     logged_in? && authorized? ? true : access_denied
  end

this is from an authentication plugin. i cant make sense of it, and
dont understand wot the '||=' symbol does. i cant google for it, cos
google strips the search for the symbol. can someone explain step by
step wot the function is doing ?

This is a ruby question so probably better suited to other places, but
anyway,
for most operators
a op= b is the same as a = a op b
So a ||= b is the same a = a || b
Because of the way ruby evaluates these things, it means set a to b
unless a is already set (in which case it won't even evaluate b).

There's at least one edge-case which reveals that it a ||= b and
a = a || b aren't quite the same:

   irb(main):007:0> h = Hash.new(1)
   => {}
   irb(main):008:0> h[:x] ||= 2
   => 1
   irb(main):009:0> h
   => {}

Here's what happens with the plain || version:

   irb(main):010:0> h[:y] = h[:y] || 3
   => 1
   irb(main):011:0> h
   => {:y=>1}

Matz had something to say about ||= at the Ruby Clinic that I
conducted on Friday at RubyConf -- namely, that it's better to think
of it this way:

   x ||= y => x || (x = y)

Translating my example that way produces the right result.

David

You learn something everyday! Thanks for that.

Fred