Self, looking for a good summary explanation

Sorry, because I have the books and have / continuing to read, just
trying to wrap myself around one aspect of "self".

My understanding is that 'self' changes amongst objects depending on
program code execution. This I get (at some level). what I don't
understand is why are some objects named self outright and does it
actually matter if you named something self or something else ?

Hope this question makes sense.

TIA
Stuart

Objects aren't really 'named' by the variables that reference them.
Consider:

def outer
   a = 3
   puts a # 3
   inner
   puts a # 3
end

def inner
   a = 4
   puts a # 4
end

outer # call method outer

Both methods have a variable 'a', but the scope is different in each
case so they are in fact different variables existing in two different
scopes but utilizing the same name. In this case the 'a' in outer
references the Fixnum object 3 and the 'a' in inner references a different
object, the Fixnum object 4.

The same concept applies to 'self'. Ruby arranges for the identifier
'self' to reference different objects depending on the scope in which
execution is occurring. So consider:

class A
   def instance_method_of_A
     self.object_id
   end
end

a1 = A.new
a2 = A.new

a1.instance_method_of_A # => 1656984
a2.instance_method_of_A # => 1650774

You can see from this example that 'self' within an instance method
references the object that is receiving the message. In the first
case the object referenced as a1 is the receiver and self.object_id
returns the object id of that object but in the second case a2 is
the receiver and self.object_id returns a different object id.

The rules regarding scopes, and the object associated with 'self' in
those various scopes, are part of what makes Ruby, well, Ruby. So understanding the various scopes and their associated variables is
the key to understanding Ruby code.

Gary Wright

···

On Jul 22, 2006, at 11:59 AM, Dark Ambient wrote:

My understanding is that 'self' changes amongst objects depending on
program code execution. This I get (at some level). what I don't
understand is why are some objects named self outright and does it
actually matter if you named something self or something else ?

self is not a variable name - It's a key word that refers to the current
object (the object to which the currently executing code in question
belongs). It's often not needed - e.g.:

class A

  def b
    # ...
  end

  def c
    self.b
  end

  def d
    b
  end

end

both 'c' and 'd' do exactly the same thing, call b on the current object,
using different syntax. However, sometimes self is necessary - e.g.:

x.rb:

class X
  def method1(some_object)
    some_object.do_something_or_other(self) # Pass my'self' - me, the
                                                 # current object as an arg.
  end
  # ...
end

y.rb:

require 'x'

class Y
  def do_work
    x = X.new
    x.method1(self) # Again, pass my'self'.
  end

  def do_something_or_other(client)
    puts "doing something with #{client}"
  end
end

test-y:

#!/usr/bin/env ruby

require 'y'

y = Y.new
y.do_work

Note that 'self' is used twice in the above example. (This is the only
way, as far as I know, to pass a reference to "the current object" in
these method calls, so 'self' is a necessary keyword. All OO languages
have such a keyword - e.g., 'this' in C++ and Java, 'Current' in Eiffel,
'self' in Python, Ruby, and, I think, Smalltalk.) It doesn't do anything
useful, since it's just a demo, but a serious program that uses 'self'
will need it to do something useful, of course.

···

On 2006-07-22, Dark Ambient <sambient@gmail.com> wrote:

Sorry, because I have the books and have / continuing to read, just
trying to wrap myself around one aspect of "self".

My understanding is that 'self' changes amongst objects depending on
program code execution. This I get (at some level). what I don't
understand is why are some objects named self outright and does it
actually matter if you named something self or something else ?