# Defining my own class of unique objects

**URL:** <https://www.ruby-forum.com/t/defining-my-own-class-of-unique-objects/89476>\
**Category:** Ruby\
**Created:** [March 20, 2007, 8:04pm UTC](https://www.ruby-forum.com/t/defining-my-own-class-of-unique-objects/89476 "2007-03-20T20:04:28Z")\
**Posts on this page:** 4\
**Page:** 1

<div class="post-metadata">

**Author:** ![jmay](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/j/e8c25b/32.png) [@jmay](https://www.ruby-forum.com/u/jmay)\
**Post date:** [March 20, 2007, 8:04pm UTC](https://www.ruby-forum.com/t/defining-my-own-class-of-unique-objects/89476/1 "2007-03-20T20:04:28Z")

</div>

Hi-

I’m trying to define a class with semantics similar to Fixnum, where  
every object is unique. Each object has some internal state, more  
complex that a single numeric value. Also, I want this to work across  
marshalling and YAML.load. Semantics like this:

Foo.new(“stuff”).object\_id == Foo.new(“stuff”).object\_id  
Foo.new(“stuff”).object\_id ==  
YAML.load(Foo.new(“stuff”).to\_yaml).object\_id

I looked at Memoize, but this just memoizes results of method calls on  
instances, I couldn’t figure out how to memoize #new.

I’m stumped. Any suggestions?

Thanks,  
-Jason

---

<div class="post-metadata">

**Author:** ![jmay](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/j/e8c25b/32.png) [@jmay](https://www.ruby-forum.com/u/jmay)\
**Post date:** [March 20, 2007, 8:47pm UTC](https://www.ruby-forum.com/t/defining-my-own-class-of-unique-objects/89476/2 "2007-03-20T20:47:34Z")

</div>

On Wed, 21 Mar 2007, jmay wrote:

> Hi-
> 
> I’m trying to define a class with semantics similar to Fixnum, where every  
> object is unique. Each object has some internal state, more complex that a  
> single numeric value. Also, I want this to work across marshalling and  
> YAML.load. Semantics like this:
> 
> Foo.new(“stuff”).object\_id == Foo.new(“stuff”).object\_id

you can do this using

[http://raa.ruby-lang.org/project/multiton/](http://raa.ruby-lang.org/project/multiton/)

or write your own based on

[http://en.wikipedia.org/wiki/Multiton\_pattern](http://en.wikipedia.org/wiki/Multiton_pattern)

> Foo.new(“stuff”).object\_id == YAML.load(Foo.new(“stuff”).to\_yaml).object\_id

dunno the yaml semantics, but this marshal example shows the pattern you  
will  
need to follow using mashaling as an example:

harp:~ \> cat a.rb  
require ‘multiton’

class Unique  
include Multiton  
def initialize \*args  
@args = args  
end

```
 def _dump *a
   Marshal.dump @args, *a
 end

 def self._load buf
   instance *(Marshal.load(buf))
 end

```

end

p( Unique.instance(1,2).object\_id == Unique.instance(1,2).object\_id )  
p( Unique.instance(1,2).object\_id ==  
Marshal.load(Marshal.dump(Unique.instance(1,2))).object\_id )

harp:~ \> ruby a.rb  
true  
true

regards.

-a

---

<div class="post-metadata">

**Author:** ![jmay](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/j/e8c25b/32.png) [@jmay](https://www.ruby-forum.com/u/jmay)\
**Post date:** [March 20, 2007, 8:50pm UTC](https://www.ruby-forum.com/t/defining-my-own-class-of-unique-objects/89476/3 "2007-03-20T20:50:35Z")

</div>

On Mar 20, 12:56 pm, “jmay” [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> I’m trying to define a class with semantics similar to Fixnum, where  
> every object is unique. Each object has some internal state, more  
> complex that a single numeric value.

Smells like you want the (name under some discussion) Multiton  
pattern:  
[http://rubyurl.com/qqw](http://rubyurl.com/qqw)

---

<div class="post-metadata">

**Author:** ![jmay](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/j/e8c25b/32.png) [@jmay](https://www.ruby-forum.com/u/jmay)\
**Post date:** [March 20, 2007, 10:41pm UTC](https://www.ruby-forum.com/t/defining-my-own-class-of-unique-objects/89476/4 "2007-03-20T22:41:00Z")

</div>

On Mar 20, 12:44 pm, removed\_email\_address@domain.invalid wrote:

> you can do this using
> 
> [http://raa.ruby-lang.org/project/multiton/](http://raa.ruby-lang.org/project/multiton/)

Multiton is exactly what I want. Thanks Ara!

To get it to work with YAML I needed to add a yaml\_as declaration and  
define self#yaml\_new in my class, and that seems to have worked. I’m  
not entirely satisfied with this solution, since it might break on  
subclasses, but it’s good for now.

Cheers,  
-Jason
