Forum: Ruby How to access variables from within class definition

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
eggman2001 (Guest)
on 2009-05-27 07:08
(Received via mailing list)
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?
Flower B. (Guest)
on 2009-05-27 07:24
(Received via mailing list)
Maybe you want to use global instead instance variable here:

* eggman2001 <removed_email_address@domain.invalid> [2009-05-27 12:07:18 +0900]:

> I've got something like:
>
> @var = 'brown'
$var = 'brown'

>
> class Foo < ActiveRecord::Base
>   set_table_name @var
set_table_name $var

-Jan
Marnen L. (Guest)
on 2009-05-27 08:05
eggman2001 wrote:
> 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,
--
Marnen Laibow-Koser
http://www.marnen.org
removed_email_address@domain.invalid
Heesob P. (Guest)
on 2009-05-27 08:44
(Received via mailing list)
2009/5/27 eggman2001 <removed_email_address@domain.invalid>:
> this?
>
You can do it using eval like this:

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

Regards,
Park H.
Brian C. (Guest)
on 2009-05-27 12:42
eggman2001 wrote:
> 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.
Shig (Guest)
on 2009-05-28 05:18
(Received via mailing list)
This helps a lot. Guess I should brush up on my variable types :-)
This topic is locked and can not be replied to.