# Singleton methods vs. class instance vars

**URL:** <https://www.ruby-forum.com/t/singleton-methods-vs-class-instance-vars/56142>\
**Category:** Ruby\
**Created:** [January 4, 2006, 12:48am UTC](https://www.ruby-forum.com/t/singleton-methods-vs-class-instance-vars/56142 "2006-01-04T00:48:39Z")\
**Posts on this page:** 1\
**Page:** 1

<div class="post-metadata">

**Author:** ![Peter\_Lacey](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/p/b9bd4f/32.png) [@Peter\_Lacey](https://www.ruby-forum.com/u/Peter_Lacey)\
**Post date:** [January 4, 2006, 12:48am UTC](https://www.ruby-forum.com/t/singleton-methods-vs-class-instance-vars/56142/1 "2006-01-04T00:48:39Z")

</div>

Hi,

I’m liberally helping myself to some of the ActiveRecord code. In  
this code there are a handful of class methods that dynamically  
create singleton methods to override the base methods. A simplified  
version follows:

class SingletonBase  
class \<\< self  
def table\_name  
reset\_table\_name  
end

```
 def reset_table_name
   puts "reset_table_name called"
   name = self.name
   sing = class << self; self; end
   sing.class_eval "def table_name; #{name.inspect}; end"
   name
 end

```

end  
end

(I hope that simplifying the code didn’t remove anything of importance.)

In this code the first time SingletonBase#table\_name is called it  
calls SingletonBase#reset\_table\_name. reset\_table\_name in turn  
creates a singleton class and adds a method that overrides table\_name  
to return what was just calculated.

Fine.

But my question is, is there any reason to prefer this method over  
using class instance variables, which seem a little clearer and  
simpler? Ala:

class InstanceBase  
class \<\< self  
def table\_name  
@table\_name || reset\_table\_name  
end

```
 def reset_table_name
   puts "reset_table_name called"
   @table_name = self.name
 end

```

end  
end

If both of these classes are exercised as follows, the results are  
comparable:

class Sub\_SingletonBase1 \< SingletonBase  
p table\_name  
p table\_name  
end

class Sub\_SingletonBase2 \< SingletonBase  
p table\_name  
p table\_name  
end

class Sub\_InstanceBase1 \< InstanceBase  
p table\_name  
p table\_name  
end

class Sub\_InstanceBase2 \< InstanceBase  
p table\_name  
p table\_name  
end

Output:

reset\_table\_name called  
“Sub\_SingletonBase1”  
“Sub\_SingletonBase1”

reset\_table\_name called  
“Sub\_SingletonBase2”  
“Sub\_SingletonBase2”

reset\_table\_name called  
“Sub\_InstanceBase1”  
“Sub\_InstanceBase1”

reset\_table\_name called  
“Sub\_InstanceBase2”  
“Sub\_InstanceBase2”

Note that there are class methods in ActiveRecord that _do_ use class  
instance variables, but not all. In particular for setting/getting  
table\_name, primary\_key, inheritance\_column, and sequence\_name,  
basically everything that can be set by the user. So, what benefit  
is derived from using virtual/meta/singleton/eigen-classes over class  
instance variables?

Regards,  
Pete
