Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Ruby > Set an instance variable before and after initialize

Reply
Thread Tools

Set an instance variable before and after initialize

 
 
Martin Jansson
Guest
Posts: n/a
 
      07-22-2006
If possible, I would like to set a instance variable in an object before
and after its initialize method is executed.

I've been looking at Class#new but it doesn't seem to have access to a
reference to the object in creation.

A possible workaround would be to place the object in an already created
hashtable. But I need to know if initialize has been completed or not
even if callcc is used.

This behavior must be shared by all objects in classes that inherit
Object.

I try to create Simula style corutines. In Simula all objects have three
states of execution: active, passive and terminated. An active object is
executing it's class body (think: Rubys Object#initialize on steroids).
The first time an object is activated is when it's created with new.
Within the class body you can call detach to make the object passive and
pause execution of the class body. Execution is then continued after the
point where the object was last activated. Within the class body you can
also call resume wich make the object passive and activates another
object. Execution is continued again when the other object become
passive or terminated. Objects can also become active if the procedure
call is called with the object as an argument. When execution reach the
end of the objects class body, the object becomes terminated and can not
be activated anymore.

You can't do all the things you can do with callcc with this kind of
corutines but it makes some otherwise hairy programming easy.

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

 
Reply With Quote
 
 
 
 
Dumaiu
Guest
Posts: n/a
 
      07-23-2006
The initialize() method, the constructor, is the earliest point at
which you can manipulate an object, because prior to that it does not
exist. Although I know diddly-doo about coroutines, it sounds to me
like you'd be better off using instances of the hypothetical
"Coroutine" class rather than the class body itself. Let an
initialized Coroutine stay dormant until it is sent a call() message,
or something like that, and then do its yielding and whatever else
Coroutines do.
There seems to be a coroutine implementation, according to Wikipedia,
iff you can read Japanese.

-J

 
Reply With Quote
 
 
 
 
Trans
Guest
Posts: n/a
 
      07-23-2006

Martin Jansson wrote:
> If possible, I would like to set a instance variable in an object before
> and after its initialize method is executed.
>
> I've been looking at Class#new but it doesn't seem to have access to a
> reference to the object in creation.


class Klass
def self.new( *args, &blk )
o = allocate
o.instance_variable_set( "@foo", "anything")
o.initialize( *args, &blk )
o.instance_variable_set( "@bar", "anything")
o
end

You could also you #instance_eval { @foo = "anything }

T.

 
Reply With Quote
 
Martin Jansson
Guest
Posts: n/a
 
      07-23-2006
Trans wrote:
> Martin Jansson wrote:
>> If possible, I would like to set a instance variable in an object before
>> and after its initialize method is executed.
>>
>> I've been looking at Class#new but it doesn't seem to have access to a
>> reference to the object in creation.

>
> class Klass
> def self.new( *args, &blk )
> o = allocate
> o.instance_variable_set( "@foo", "anything")
> o.initialize( *args, &blk )
> o.instance_variable_set( "@bar", "anything")
> o
> end
>
> You could also you #instance_eval { @foo = "anything }
>
> T.


This break the chain of inheritance. You would have to reimplement all
classes that you use; it would be more complicated to use then Thread
even if it would have the advantage that you could circumvent some of
Threads limitations. I'm not even sure that it would behave correctly.
Class#new seem to do more then call allocate and initialize. But I could
be wrong. Here is the C code for Class#new:

VALUE
rb_class_new_instance(argc, argv, klass)
int argc;
VALUE *argv;
VALUE klass;
{
VALUE obj;

obj = rb_obj_alloc(klass);
rb_obj_call_init(obj, argc, argv);

return obj;
}

I've looked at rb_obj_call_init, but I can't seem to find it at the
moment.

My current hack has an ActiveObject class that I use instead of Object.
In this class I have a method called body instead of initialize.
initialize is already used to set that damn variable and to call body
and can not be rewritten. All this of course breaks the chain of
inherritance.

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

 
Reply With Quote
 
Erik Veenstra
Guest
Posts: n/a
 
      07-23-2006
That won't work: initialize is private. And it might better to
overwrite Object.new, so it works for all classes.

What about singleton? (I mean "include Singleton".)

gegroet,
Erik V. - http://www.erikveen.dds.nl/

----------------------------------------------------------------

class Object
def self.new( *args, &blk )
o = allocate
o.instance_variable_set( "@foo", "anything")
o.instance_eval{initialize( *args, &blk )}
o.instance_variable_set( "@bar", "anything")
o
end
end

class Foo
def initialize(baz)
@baz = baz
end

def bar
p @foo
p @bar
p @baz
end
end

Foo.new(.bar

----------------------------------------------------------------


 
Reply With Quote
 
Trans
Guest
Posts: n/a
 
      07-23-2006
Damn! You guys are sticklers! You want complete, universally
applicable, 100% bug-free implementations for a general mailing list
question. How much time do I have?

T.

 
Reply With Quote
 
Erik Veenstra
Guest
Posts: n/a
 
      07-23-2006
Think about this:

Write once.
Read never.
Use everywhere.

So, yes, "universally applicable" would be nice... ;]

gegroet,
Erik V. - http://www.erikveen.dds.nl/


 
Reply With Quote
 
ara.t.howard@noaa.gov
Guest
Posts: n/a
 
      07-23-2006
On Sun, 23 Jul 2006, Martin Jansson wrote:

> If possible, I would like to set a instance variable in an object before and
> after its initialize method is executed.


let initialize help you do this then:


harp:~ > cat a.rb
module BeforeAfterInit
module InstanceMethods
def before_initialize *a, &b
end
def after_initialize *a, &b
end
def initialize *a, &b
before_initialize *a, &b
r = super
after_initialize *a, &b
r
end
end
module ClassMethods
def before &b
define_method 'before_initialize', &b
end
def after &b
define_method 'after_initialize', &b
end
end
def self.included other
other.module_eval{ include InstanceMethods }
other.extend ClassMethods
super
end
end

class C
include BeforeAfterInit

before{ @a = 40 }
after{ @b = 2 }

def m() @a + @b end
end

p C.new.m



harp:~ > ruby a.rb
42


regards.

-a
--
suffering increases your inner strength. also, the wishing for suffering
makes the suffering disappear.
- h.h. the 14th dali lama

 
Reply With Quote
 
Ben Nagy
Guest
Posts: n/a
 
      07-26-2006
I have a couple of questions...

> -----Original Message-----
> From: [private.php?do=newpm&u=]
> Sent: Sunday, July 23, 2006 9:34 PM
> To: ruby-talk ML
> Subject: Re: Set an instance variable before and after initialize
>
> On Sun, 23 Jul 2006, Martin Jansson wrote:
>
> > If possible, I would like to set a instance variable in an

> object before and
> > after its initialize method is executed.

>
> let initialize help you do this then:
>
>
> harp:~ > cat a.rb
> module BeforeAfterInit
> module InstanceMethods
> def before_initialize *a, &b
> end
> def after_initialize *a, &b
> end
> def initialize *a, &b
> before_initialize *a, &b
> r = super


What does this construction (r=super) do? I tried removing both references
to r and replacing it with a single 'super' and it seemed to behave
identically.

> after_initialize *a, &b
> r
> end
> end
> module ClassMethods
> def before &b
> define_method 'before_initialize', &b
> end
> def after &b
> define_method 'after_initialize', &b
> end
> end
> def self.included other
> other.module_eval{ include InstanceMethods }
> other.extend ClassMethods
> super
> end
> end
>
> class C
> include BeforeAfterInit
>
> before{ @a = 40 }
> after{ @b = 2 }


When I define an initialize method here without using super, it breaks
(obvious, I guess), When I use super the before and after code gets run at
the same time - in other words:

def initialize
p @a #should be set, but => nil
super
end

So to my naive understanding this doesn't acheive the goal. What am I
missing?

> def m() @a + @b end
> end
>
> p C.new.m
>
>
>
> harp:~ > ruby a.rb
> 42


Cheers,

ben


 
Reply With Quote
 
ara.t.howard@noaa.gov
Guest
Posts: n/a
 
      07-26-2006
On Wed, 26 Jul 2006, Ben Nagy wrote:

> What does this construction (r=super) do? I tried removing both references
> to r and replacing it with a single 'super' and it seemed to behave
> identically.


it says: return whatever super used to. it's just good form when you wrap a
method.

>> include BeforeAfterInit
>>
>> before{ @a = 40 }
>> after{ @b = 2 }

>
> When I define an initialize method here without using super, it breaks
> (obvious, I guess), When I use super the before and after code gets run at
> the same time - in other words:
>
> def initialize
> p @a #should be set, but => nil


but why? you haven't called super yet. try calling it first.

-a
--
suffering increases your inner strength. also, the wishing for suffering
makes the suffering disappear.
- h.h. the 14th dali lama

 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
initialize instance variable problem Cameron Vessey Ruby 4 08-29-2010 09:31 AM
including instance methods and setting an instance variable Leon Bogaert Ruby 19 03-23-2008 09:29 PM
Initialize global variable before any other global variables jubelbrus C++ 5 07-20-2007 06:38 PM
if instance variable get initialize after assigning some values or after constructor then when does static variable get initialize Tony Morris Java 3 02-04-2006 08:39 AM
Problem when subclass instance changes base class instance variable Gerry Sutton Python 1 04-16-2005 06:06 AM



Advertisments
 



1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57