Does an instance know his own name?

If a class has built checks and raises an exception if it finds
something wrong, how can I tell which instance had the error? I know
there's an object_id, but can I know the name of the objects own
instance variable?

huey = Nephew.new
duey = Nephew.new
luey = Nephew.new

duey.raise_error_on_purpose_just_for_fun #-> "Nephew 'duey' raised an
error"

Also, can an instance know his 'path' from the top-level?

class Donald

def initialize
   @huey = Nephew.new
   @duey = Nephew.new
   @luey = Nephew.new
end

end

Donald1 = Donald.new
Donald2 = Donald.new

Donald1.huey.raise_error_on_purpose_just_for_fun
#-> "Nephew Donald1.huey raised an error"

Thanks,

···

--
Posted via http://www.ruby-forum.com/.

Geoff Barnes wrote:

If a class has built checks and raises an exception if it finds
something wrong, how can I tell which instance had the error? I know
there's an object_id, but can I know the name of the objects own
instance variable?

<snip />

Also, can an instance know his 'path' from the top-level?

<snip />

No and no (at least, no sensible way). You are dealing with
symbolic names 'huey' versus actual references and objects.

The 'proper' way is to have the object know its name:

huey = Nephew.new 'Huey'

···

Thanks,

--
Posted via http://www.ruby-forum.com/.

If a class has built checks and raises an exception if it finds
something wrong, how can I tell which instance had the error? I know
there's an object_id, but can I know the name of the objects own
instance variable?

Instances don't have names.

huey = Nephew.new
duey = Nephew.new
luey = Nephew.new

These are examples of binding an instance to a particular key (think of it in terms of a dictionary/hashtable), and not naming the instances of Nephew: huey, duey and luey.

···

On 06-09-03, at 23:10, Geoff Barnes wrote:

--
Jeremy Tregunna
jtregunna@blurgle.ca

You can identify an object by its object_id. Variables are just
references to an object with a convenient name for your use. If you
want to give an object an actual name, you have to pass it in as a
parameter on construction.

Geoff Barnes wrote:

···

If a class has built checks and raises an exception if it finds
something wrong, how can I tell which instance had the error? I know
there's an object_id, but can I know the name of the objects own
instance variable?

huey = Nephew.new
duey = Nephew.new
luey = Nephew.new

duey.raise_error_on_purpose_just_for_fun #-> "Nephew 'duey' raised an
error"

Also, can an instance know his 'path' from the top-level?

class Donald

def initialize
   @huey = Nephew.new
   @duey = Nephew.new
   @luey = Nephew.new
end

end

Donald1 = Donald.new
Donald2 = Donald.new

Donald1.huey.raise_error_on_purpose_just_for_fun
#-> "Nephew Donald1.huey raised an error"

Thanks,

--
Posted via http://www.ruby-forum.com/.

Geoff Barnes wrote:

huey = Nephew.new
duey = Nephew.new
luey = Nephew.new

duey.raise_error_on_purpose_just_for_fun #-> "Nephew 'duey' raised an
error"

And what would happen if you did:
huey = Nephew.new
duey = huey
luey = duey
some_array = [ huey ]
huey = nil

duey.raise_error #=> "Nephew...uhm...duey, luey, some_array[ 0
]?...raised an error."

A variable doesn't hold an object, it holds a reference to it. Many
variables (local, global, instance, and class) can all refer to the
same object.

If you have a symbolic name that is unique to an instance, pass that
name in when creating the instance.

It is sort of possible to find out someone's name. The following of course, is easily breakable.
% cat names.rb
class Nephew
   def name(&block)
     names_objects = eval("local_variables.inject({}){ |h, k| h[k] = eval(k); h}", block)

     names_objects.find { |k, v| v.object_id == object_id }.first
   end
end

huey = Nephew.new
duey = Nephew.new
louie = Nephew.new

puts huey.name{}

% ruby names.rb
huey

···

On Sep 5, 2006, at 8:30 AM, Timothy Goddard wrote:

You can identify an object by its object_id. Variables are just
references to an object with a convenient name for your use. If you
want to give an object an actual name, you have to pass it in as a
parameter on construction.

Geoff Barnes wrote:

If a class has built checks and raises an exception if it finds
something wrong, how can I tell which instance had the error? I know
there's an object_id, but can I know the name of the objects own
instance variable?

huey = Nephew.new
duey = Nephew.new
luey = Nephew.new