How to access variables from within class definition

E

eggman2001

I've got something like:

@var = 'brown'

class Foo < ActiveRecord::Base
set_table_name @var
end

However, as the code is right now, I'm not able to access @var from
within the class definition. Can someone tell me how I can accomplish
this?
 
M

Marnen Laibow-Koser

eggman2001 said:
I've got something like:

@var = 'brown'

class Foo < ActiveRecord::Base
set_table_name @var
end

However, as the code is right now, I'm not able to access @var from
within the class definition. Can someone tell me how I can accomplish
this?

Of course you can't see @var from within the class definition if you set
it outside. Remember that @variables are instance variables, and are
scoped to the class definition.

If you can explain where you're trying to set @var, perhaps we can come
up with an alternative approach.

Best,
 
H

Heesob Park

2009/5/27 eggman2001 said:
I've got something like:

@var =3D 'brown'

class Foo < ActiveRecord::Base
=C2=A0set_table_name @var
end

However, as the code is right now, I'm not able to access @var from
within the class definition. Can someone tell me how I can accomplish
this?
You can do it using eval like this:

@var =3D 'brown'
class Foo
p eval('@var',TOPLEVEL_BINDING)
end

Regards,
Park Heesob
 
B

Brian Candler

eggman2001 said:
I've got something like:

@var = 'brown'

This is an instance variable of the top-level (main) object.
class Foo < ActiveRecord::Base
set_table_name @var
end

Now you're inside class Foo, @var is an instance variable of the Foo
class object (sometimes called a "class instance variable", but it's
just an instance variable like any other)
However, as the code is right now, I'm not able to access @var from
within the class definition. Can someone tell me how I can accomplish
this?

(1) Horrible:

class Foo < ActiveRecord::Base
set_table_name eval("@var", TOPLEVEL_BINDING)
end

(2) Much better to use a local variable:

var = 'brown'
Foo.set_table_name var

That should work unless set_table_name is a private method. If it is,
then:

(3)
var = 'brown'
Foo.class_eval { set_table_name var }

You see that local variables propagate happily into blocks. It's only
'class' and 'def' which start with a clean slate as far as local
variables are concerned.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
474,432
Messages
2,571,682
Members
48,796
Latest member
Greg L.

Latest Threads

Top