Stefano Crocco wrote:
> On Wednesday 09 April 2008, Hexren wrote:
>> Hi guys.
>>
>> The code posted below actually modifies the array in the object.
>> Am I doing something wrong here ?
>> If not, this should imho be included in the doc. It seems
>> counterintuitive to me ;)
>>
>>
>> Regards
>> Oliver
>>
>> ----------------------------------
>> class AttrReaderErr
>>    attr_reader :entries
>>    def initialize()
>>      @entries = [0,1,2]
>>    end
>> end
>>
>> showcase = AttrReaderErr.new
>>
>> puts showcase.entries
>> #should this really work ?
>> showcase.entries[1]="foo"
>> #it does, but looks wrong
>> puts showcase.entries
>> ----------------------------------
> 
> It works correctly, once you understand exactly what's going on. attr_reader 
> creates a method which returns the object stored in the instance variable 
> @entries. If it were written by hand, it would be something like:
> 
> def entries
>   @entries
> end
> 
> Writing entries[1]="foo", you're calling the []= method of the object returned 
> by entries, that is, the array stored in @entries. Since the []= method 
> modifies the receiver, the content of @entries is modified. If you don't want 
> this to happen, you need to create the entries method by hand and return a 
> copy of the array:
> 
> def entries
>   @entries.dup
> end
> 
> I hope this helps
> 
> Stefano
> 


Yup, what you say makes sense, thanks :)

But I maintain, that the doc is kind of confusing. The fingerprint:
"attr(symbol, writable=false) => nil"

Very strongly implies (at least to me) that the default is, for the 
instance variable to be not writable. I am going to go, cry wolf on the 
doc mailing list :)

Oliver