# Pass an array to a new instance of a class

**URL:** <https://www.ruby-forum.com/t/pass-an-array-to-a-new-instance-of-a-class/194105>\
**Category:** Ruby\
**Created:** [August 30, 2010, 3:21pm UTC](https://www.ruby-forum.com/t/pass-an-array-to-a-new-instance-of-a-class/194105 "2010-08-30T15:21:08Z")\
**Posts on this page:** 6\
**Page:** 1

<div class="post-metadata">

**Author:** ![grauenwolf](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/g/e8c25b/32.png) [@grauenwolf](https://www.ruby-forum.com/u/grauenwolf)\
**Post date:** [August 30, 2010, 3:21pm UTC](https://www.ruby-forum.com/t/pass-an-array-to-a-new-instance-of-a-class/194105/1 "2010-08-30T15:21:08Z")

</div>

I am having trouble passing values to an array of a new instance of the  
class Item that I have created. The following codse does not fille the  
flags array with the value ‘container’.

class Item  
attr\_accessor :inum, :name, :description, :slot, :flags, :items

def initialize( inum, name, description, slot, flags, items )  
@inum = inum  
@name = name  
@description = description  
@slot = slot  
@flags = []  
@items = []  
end

def is\_container  
return true if flags.include?(container)  
end  
end

Item.new(“0007”, “crate”, “A large crate.\r\n”, “:none”, “container”,  
“”)

However when I use the code below, I am able to add the value  
‘container’ to the flags array.

$rooms[(“0001”)].item(“crate”).flags \<\< “container”

My question is, how do I modify the first bit of code to allow passing  
values to the array of the new instance of the class Item?

---

<div class="post-metadata">

**Author:** ![grauenwolf](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/g/e8c25b/32.png) [@grauenwolf](https://www.ruby-forum.com/u/grauenwolf)\
**Post date:** [August 30, 2010, 3:34pm UTC](https://www.ruby-forum.com/t/pass-an-array-to-a-new-instance-of-a-class/194105/2 "2010-08-30T15:34:34Z")

</div>

If I’m understanding right, the modifications I made to your code below  
should do what you want

On Mon, Aug 30, 2010 at 9:21 AM, Jonathan A. \<

---

<div class="post-metadata">

**Author:** ![grauenwolf](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/g/e8c25b/32.png) [@grauenwolf](https://www.ruby-forum.com/u/grauenwolf)\
**Post date:** [August 30, 2010, 4:55pm UTC](https://www.ruby-forum.com/t/pass-an-array-to-a-new-instance-of-a-class/194105/3 "2010-08-30T16:55:40Z")

</div>

Robert K. wrote:

> If you do not always pass an Array you can do
> 
> @items = []  
> @items \<\< items

Thanks Robert. I didn’t think about pushing the items into the array  
from within the actual code for the class Item itself.

This worked just the way I was hoping. Thanks again!

---

<div class="post-metadata">

**Author:** ![grauenwolf](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/g/e8c25b/32.png) [@grauenwolf](https://www.ruby-forum.com/u/grauenwolf)\
**Post date:** [August 30, 2010, 4:04pm UTC](https://www.ruby-forum.com/t/pass-an-array-to-a-new-instance-of-a-class/194105/4 "2010-08-30T16:04:25Z")

</div>

2010/8/30 Jonathan A. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid):

> @name = name  
> @description = description  
> @slot = slot  
> @flags = []  
> @items = []

You could do

@items = items.dup

i.e. copy an array passed via parameter “items”. If you want to  
explicitly create an array you can do

@items = [].concat items

If you do not always pass an Array you can do

@items = []  
case items  
when String  
@items \<\< items  
when Array  
@items.concat items  
when Enumerable  
@items.concat items.to\_a  
else  
raise ArgumentError, “Dunno what to do with %p” % items  
end

> end
> 
> def is\_container  
> return true if flags.include?(container)  
> end

You can simply do

def is\_container?  
flags.include? container  
end

> $rooms[(“0001”)].item(“crate”).flags \<\< “container”
> 
> My question is, how do I modify the first bit of code to allow passing  
> values to the array of the new instance of the class Item?

Hope the suggestions help.

Kind regards

robert

---

<div class="post-metadata">

**Author:** ![grauenwolf](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/g/e8c25b/32.png) [@grauenwolf](https://www.ruby-forum.com/u/grauenwolf)\
**Post date:** [August 31, 2010, 8:31am UTC](https://www.ruby-forum.com/t/pass-an-array-to-a-new-instance-of-a-class/194105/5 "2010-08-31T08:31:34Z")

</div>

On 08/30/2010 04:56 PM, Jonathan A. wrote:

> Robert K. wrote:
> 
> > If you do not always pass an Array you can do
> > 
> > @items = []  
> > @items\<\< items
> 
> Thanks Robert. I didn’t think about pushing the items into the array  
> from within the actual code for the class Item itself.
> 
> This worked just the way I was hoping. Thanks again!

Note though that the code above only appends a single Array to the Array

- it does not “push items into the array”! For that you need #concat as  
I have shown.

Kind regards

robert

---

<div class="post-metadata">

**Author:** ![grauenwolf](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/g/e8c25b/32.png) [@grauenwolf](https://www.ruby-forum.com/u/grauenwolf)\
**Post date:** [August 30, 2010, 5:08pm UTC](https://www.ruby-forum.com/t/pass-an-array-to-a-new-instance-of-a-class/194105/6 "2010-08-30T17:08:51Z")

</div>

On Mon, Aug 30, 2010 at 3:21 PM, Jonathan A.  
[removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> def is\_container  
> return true if flags.include?(container)  
> end  
> end

Apart from all the other suggestions, you should change the container  
above to “container”.

Jesus.
