tags:

views:

44

answers:

3

I want to have an array as a instance variable using attr_accessor.

But isn't attr_accessor only for strings?

How do I use it on an array?

UPDATE:

Eg. If you want:

object.array = "cat"
object.array = "dog"
pp object.array
=> ["cat", "dog"]

Then you have to create those methods yourself?

+1  A: 

It works for me:

class Foo

  attr_accessor :arr

  def initialize() 
    @arr = [1,2,3]
  end

end

f = Foo.new
p f.arr

Returns the following

$ ruby /tmp/t.rb
[1, 2, 3]
$
Paul Rubel
+4  A: 
class SomeObject
  attr_accessor :array

  def initialize
    self.array = []
  end
end

o = SomeObject.new

o.array.push :a
o.array.push :b
o.array << :c
o.array.inspect   #=> [:a, :b, :c]
Ryan McGeary
+1  A: 

Re your update:

Although you can implement a class which acts as you describe, it is quite unusual, and will probably confuse anyone using the class.

Normally accessors have setters and getters. When you set something using the setter, you get the same thing back from the getter. In the example below, you get something totally different back from the getter. Instead of using a setter, you should probably use an add method.

class StrangePropertyAccessorClass

  def initialize
    @data = []
  end

  def array=(value)   # this is bad, use the add method below instead
    @data.push(value)
  end

  def array
    @data
  end

end

object = StrangePropertyAccessorClass.new

object.array = "cat"
object.array = "dog"
pp object.array

The add method would look like this:

  def add(value)
    @data.push(value)
  end

...

object.add "cat"
object.add "dog"
pp object.array
Douglas
+1 for giving an explanation. I also like the << method. So you can write object.array << "cat" instead of push. This is only one character more than object.array = "cat" .
Baju
Yeah, also it makes sense at all, unlike `object.array = "cat"`, which is completely batty.
Jonathan Sterling