Is my instance variable being masked?

This is probably trivial for the pros here, but

I have a class

class MyClass
    attr_accessor :raw_vehicle_data

  def parse_raw_vehicle_data
    @raw_vehicle_data = [0,1,2,3,4]
    puts raw_vehicle_data.size # => gives proper size of the array
(i.e. size > 0)
    # do other stuff with raw_vehicle_data
  end
end

irb(main):019:0> my_class = MyClass.new
=> #<MyClass:0x00000102005f98>
irb(main):020:0> my_class.parse_raw_vehicle_data
5 #<= this value I expect, but it's not assigned to my "instance
variable"
=> nil
irb(main):021:0> my_class.raw_vehicle_data.size
=> nil

If I change the line from raw_vehicle_data = [0,1,2,3,4] to
@raw_vehicle_data = [0,1,2,3,4], then everything works properly, but I
thought attr_accessor gave me access to the function
"raw_vehicle_data=" that would assign to an instance variable.

Apparently I'm wrong, but not sure why.

Thanks!

Your code listing above has the @raw_vehicle_data reference, but I think
you meant to leave off the @ there for your problem demonstration.
Leaving off the @ introduces an ambiguity for Ruby in assignment
statements like yours. The left hand side is seen as a local variable
reference rather than a call to the attr_writer method of the same name.

You can either use the @ as you discovered, or you can explicitly call
the attr_writer:

self.raw_vehicle_data = [0,1,2,3,4]

-Jeremy

···

On 12/09/2010 04:20 PM, Sylvester T Cat wrote:

This is probably trivial for the pros here, but

I have a class

class MyClass
    attr_accessor :raw_vehicle_data

  def parse_raw_vehicle_data
    @raw_vehicle_data = [0,1,2,3,4]
    puts raw_vehicle_data.size # => gives proper size of the array
(i.e. size > 0)
    # do other stuff with raw_vehicle_data
  end
end

irb(main):019:0> my_class = MyClass.new
=> #<MyClass:0x00000102005f98>
irb(main):020:0> my_class.parse_raw_vehicle_data
5 #<= this value I expect, but it's not assigned to my "instance
variable"
=> nil
irb(main):021:0> my_class.raw_vehicle_data.size
=> nil

If I change the line from raw_vehicle_data = [0,1,2,3,4] to
@raw_vehicle_data = [0,1,2,3,4], then everything works properly, but I
thought attr_accessor gave me access to the function
"raw_vehicle_data=" that would assign to an instance variable.