# Setting attributes with composition

**URL:** <https://www.ruby-forum.com/t/setting-attributes-with-composition/120037>\
**Category:** Ruby\
**Created:** [November 13, 2007, 7:26am UTC](https://www.ruby-forum.com/t/setting-attributes-with-composition/120037 "2007-11-13T07:26:31Z")\
**Posts on this page:** 4\
**Page:** 1

<div class="post-metadata">

**Author:** ![Thufir](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/ee7513/32.png) [@Thufir](https://www.ruby-forum.com/u/Thufir)\
**Post date:** [November 13, 2007, 7:26am UTC](https://www.ruby-forum.com/t/setting-attributes-with-composition/120037/1 "2007-11-13T07:26:31Z")

</div>

The Dragon class is composed of the Room class and the Traits class.  
The Room class inherits from the Location class which has attribute  
accessors.

> From the “creatures.rb” file, how can the attributes for a particular  
> Dragon object be set or read, please?

If the attributes are directly in the Dragon class (or its superclass,  
Creature) then the attributes can be read fine.

thufir@arrakis ~/rubyCode/creatures5 $  
thufir@arrakis ~/rubyCode/creatures5 $  
thufir@arrakis ~/rubyCode/creatures5 $ ruby creatures.rb  
creatures.rb:14: undefined local variable or method `creaturs’ for  
main:Object (NameError)  
thufir@arrakis ~/rubyCode/creatures5 $  
thufir@arrakis ~/rubyCode/creatures5 $ cat Creature.rb  
require ‘Math’  
require ‘Traits’  
require ‘Room’

class Creature

Creature.extend Math  
include Math

def initialize ()  
@location = Room.new  
@traits = Traits.new  
end

def saysHello ()  
print self.class  
puts " says to fuck off"  
end

def inspect ()  
print “class\t\t”  
print self.class

```
    @location.inspect
    @traits.inspect

    print "\n"

```

end

end  
thufir@arrakis ~/rubyCode/creatures5 $  
thufir@arrakis ~/rubyCode/creatures5 $ cat Location.rb  
class Location

attr\_accessor :x, :y

def initialize ()  
@x = 0  
@y = 0  
end

def inspect ()  
print “\nx\t\t”  
print x  
print “\ny\t\t”  
print y  
end

end  
thufir@arrakis ~/rubyCode/creatures5 $  
thufir@arrakis ~/rubyCode/creatures5 $ cat Room.rb  
require ‘Location’

class Room \< Location

def initialize ()  
@x = 0  
@y = 0  
end

end  
thufir@arrakis ~/rubyCode/creatures5 $  
thufir@arrakis ~/rubyCode/creatures5 $ cat Location.rb  
class Location

attr\_accessor :x, :y

def initialize ()  
@x = 0  
@y = 0  
end

def inspect ()  
print “\nx\t\t”  
print x  
print “\ny\t\t”  
print y  
end

end  
thufir@arrakis ~/rubyCode/creatures5 $  
thufir@arrakis ~/rubyCode/creatures5 $ cat Dragon.rb  
require ‘Creature’

class Dragon \< Creature

def initialize ()  
super  
end

end  
thufir@arrakis ~/rubyCode/creatures5 $  
thufir@arrakis ~/rubyCode/creatures5 $ date  
Mon Nov 12 22:17:55 PST 2007  
thufir@arrakis ~/rubyCode/creatures5 $  
thufir@arrakis ~/rubyCode/creatures5 $

---

<div class="post-metadata">

**Author:** ![Thufir](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/ee7513/32.png) [@Thufir](https://www.ruby-forum.com/u/Thufir)\
**Post date:** [November 13, 2007, 7:30am UTC](https://www.ruby-forum.com/t/setting-attributes-with-composition/120037/2 "2007-11-13T07:30:36Z")

</div>

I seem to have omitted the particular ruby file which directly  
generated the error:

thufir@arrakis ~/rubyCode/creatures5 $  
thufir@arrakis ~/rubyCode/creatures5 $  
thufir@arrakis ~/rubyCode/creatures5 $ ruby creatures.rb  
creatures.rb:14: undefined local variable or method `creaturs’ for  
main:Object (NameError)  
thufir@arrakis ~/rubyCode/creatures5 $  
thufir@arrakis ~/rubyCode/creatures5 $ cat creatures.rb  
require ‘ArrayOfCreatures’  
require ‘MakeCreature’  
require ‘Location’

include MakeCreature

NumOfCreatures=2  
creatures = ArrayOfCreatures.instance

NumOfCreatures.times do |i|  
creatures[i]=Dragon.new  
end

creaturs[0].location.x = 3  
thufir@arrakis ~/rubyCode/creatures5 $  
thufir@arrakis ~/rubyCode/creatures5 $ date  
Mon Nov 12 22:28:42 PST 2007  
thufir@arrakis ~/rubyCode/creatures5 $  
thufir@arrakis ~/rubyCode/creatures5 $

-Thufir

---

<div class="post-metadata">

**Author:** ![Thufir](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/ee7513/32.png) [@Thufir](https://www.ruby-forum.com/u/Thufir)\
**Post date:** [November 13, 2007, 10:41am UTC](https://www.ruby-forum.com/t/setting-attributes-with-composition/120037/3 "2007-11-13T10:41:28Z")

</div>

> creaturs[0].location.x = 3

all i can see here, without too much analysis of your code, is that you  
use creaturs[0] instead of creatures[0]

---

<div class="post-metadata">

**Author:** ![Thufir](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/ee7513/32.png) [@Thufir](https://www.ruby-forum.com/u/Thufir)\
**Post date:** [November 13, 2007, 11:12am UTC](https://www.ruby-forum.com/t/setting-attributes-with-composition/120037/4 "2007-11-13T11:12:22Z")

</div>

Yeah, spellink error corrected (thanks). I want to be able to set the  
location for a dragon with something like:

drgn=Dragon.new  
drgn.location(3,4)

However, I don’t want a “location” method added to Dragon nor its  
superclass of Creature. That is, how is the location for drgn  
changed? The exact syntax isn’t so important.

I seem to have lost meaningful output from the inspect method, seems  
to be the object id ☹

thufir@arrakis ~/rubyCode/creatures5 $  
thufir@arrakis ~/rubyCode/creatures5 $  
thufir@arrakis ~/rubyCode/creatures5 $  
thufir@arrakis ~/rubyCode/creatures5 $ ruby creatures.rb  
#Dragon:0xb7bf031c  
#Dragon:0xb7bf0308  
thufir@arrakis ~/rubyCode/creatures5 $  
thufir@arrakis ~/rubyCode/creatures5 $ cat creatures.rb  
require ‘ArrayOfCreatures’  
require ‘MakeCreature’  
require ‘Location’

include MakeCreature

NumOfCreatures=2  
creatures = ArrayOfCreatures.instance

NumOfCreatures.times do |i|  
creatures[i]=Dragon.new  
end

creatures[0].location.x = 3

puts creatures  
thufir@arrakis ~/rubyCode/creatures5 $  
thufir@arrakis ~/rubyCode/creatures5 $ cat Creature.rb  
require ‘Math’  
require ‘Traits’  
require ‘Room’

class Creature

Creature.extend Math  
include Math

attr\_accessor :location

def initialize ()  
@location = Room.new  
@traits = Traits.new  
end

def saysHello ()  
print self.class  
puts " says to fuck off"  
end

def inspect ()  
print “class\t\t”  
print self.class

```
    @location.inspect
    @traits.inspect

    print "\n"

```

end

end  
thufir@arrakis ~/rubyCode/creatures5 $  
thufir@arrakis ~/rubyCode/creatures5 $ cat Dragon.rb  
require ‘Creature’

class Dragon \< Creature

def initialize ()  
super  
end

def inspect ()  
super  
end

end  
thufir@arrakis ~/rubyCode/creatures5 $  
thufir@arrakis ~/rubyCode/creatures5 $ cat Location.rb  
class Location

attr\_accessor :x, :y

def initialize ()  
@x = 0  
@y = 0  
end

def inspect ()  
print “\nx\t\t”  
print x  
print “\ny\t\t”  
print y  
end

end  
thufir@arrakis ~/rubyCode/creatures5 $  
thufir@arrakis ~/rubyCode/creatures5 $ cat Room.rb  
require ‘Location’

class Room \< Location

def initialize ()  
super  
end

def inspect ()  
super  
end

end  
thufir@arrakis ~/rubyCode/creatures5 $  
thufir@arrakis ~/rubyCode/creatures5 $ cat Traits.rb  
class Traits

end  
thufir@arrakis ~/rubyCode/creatures5 $  
thufir@arrakis ~/rubyCode/creatures5 $ date  
Tue Nov 13 02:06:30 PST 2007  
thufir@arrakis ~/rubyCode/creatures5 $  
thufir@arrakis ~/rubyCode/creatures5 $

thanks,

Thufir
