A
Adam Bender
I noticed some surprising behavior in one of my Ruby programs, and am
wondering what the rationale is. Basically,
given read-only access to a member variable (using attr_reader) of
class Array, I can modify that Array by modifying (what I think should
be) a local copy of it. Shouldn't the accessor return a copy of the
variable instead of a reference to it? Or is it standard practice to
hand-write an accessor for arrays that returns a clone of the array?
#!/usr/bin/ruby
class Example
attr_reader :elems
def initialize
@elems = []
3.times { @elems << Object.new }
end
def to_s
@elems.inspect
end
end
e = Example.new
puts e
# output is:
# -604282308
# [#<Object:0xb7f6c450>, #<Object:0xb7f6c43c>, #<Object:0xb7f6c428>]
list = e.elems
puts list.object_id
# output is: -604282308
list.delete_at(0)
puts e
# output is
# -604282308
# [#<Object:0xb7f6c43c>, #<Object:0xb7f6c428>]
wondering what the rationale is. Basically,
given read-only access to a member variable (using attr_reader) of
class Array, I can modify that Array by modifying (what I think should
be) a local copy of it. Shouldn't the accessor return a copy of the
variable instead of a reference to it? Or is it standard practice to
hand-write an accessor for arrays that returns a clone of the array?
#!/usr/bin/ruby
class Example
attr_reader :elems
def initialize
@elems = []
3.times { @elems << Object.new }
end
def to_s
@elems.inspect
end
end
e = Example.new
puts e
# output is:
# -604282308
# [#<Object:0xb7f6c450>, #<Object:0xb7f6c43c>, #<Object:0xb7f6c428>]
list = e.elems
puts list.object_id
# output is: -604282308
list.delete_at(0)
puts e
# output is
# -604282308
# [#<Object:0xb7f6c43c>, #<Object:0xb7f6c428>]