# Calling private accessors

**URL:** <https://www.ruby-forum.com/t/calling-private-accessors/194784>\
**Category:** Ruby\
**Created:** [September 10, 2010, 4:10pm UTC](https://www.ruby-forum.com/t/calling-private-accessors/194784 "2010-09-10T16:10:17Z")\
**Posts on this page:** 4\
**Page:** 1

<div class="post-metadata">

**Author:** ![Davy\_B](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/7ba0ec/32.png) [@Davy\_B](https://www.ruby-forum.com/u/Davy_B)\
**Post date:** [September 10, 2010, 4:10pm UTC](https://www.ruby-forum.com/t/calling-private-accessors/194784/1 "2010-09-10T16:10:17Z")

</div>

Hi,

i bumbed into something weird today, and would like to know what’s going  
on… here’s a contrived example:

class Test  
attr\_reader :name

def set\_the\_name(value)  
name = value  
end

private

def name=(value)  
@name = value  
end  
end

test = Test.new  
test.set\_the\_name “some name”  
p test

the output of this on ruby 1.8.7 (as wel as on 1.9.2) is:

#Test:0x7fef6dc8

the name accessor wasn’t called, but there was no error either

if i change the set\_the\_name method to this:

def set\_the\_name(value)  
self.name = value  
end

then the output changes to this:

#\<Test:0x7fef6da0 @name=“some name”\>

there are two things i don’t quite understand about this:

1. i thought private methods should never be called through self, and  
that  
they are implicitely called on self. calling a non-accessor private  
method  
on self does raise the expected error. why does the accessor need to be  
called using self?
2. when calling the private accessor without using self, its  
implementation  
clearly isn’t executed but no exception is raised either… why is that?

---

<div class="post-metadata">

**Author:** ![Davy\_B](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/7ba0ec/32.png) [@Davy\_B](https://www.ruby-forum.com/u/Davy_B)\
**Post date:** [September 10, 2010, 4:17pm UTC](https://www.ruby-forum.com/t/calling-private-accessors/194784/2 "2010-09-10T16:17:54Z")

</div>

Davy B. wrote:

> def set\_the\_name(value)  
> name = value  
> end

To Ruby, that’s an assignment to a local variable, which then drops out  
of scope. That’s why you have to do “self.name= value” to call the  
method.

If it really were private, you’d need

send(:name=, value)

although being private rather negates the purpose of an ‘accessor’ which  
is to make values accessible 🙂

> when calling the private accessor without using self, its  
> implementation  
> clearly isn’t executed but no exception is raised either… why is that?

Because it’s perfectly legal to assign a value to a local variable 🙂

---

<div class="post-metadata">

**Author:** ![Davy\_B](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/7ba0ec/32.png) [@Davy\_B](https://www.ruby-forum.com/u/Davy_B)\
**Post date:** [September 10, 2010, 4:48pm UTC](https://www.ruby-forum.com/t/calling-private-accessors/194784/3 "2010-09-10T16:48:56Z")

</div>

On Fri, Sep 10, 2010 at 4:18 PM, Brian C. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)  
wrote:

> Davy B. wrote:
> 
> > def set\_the\_name(value)  
> > name = value  
> > end
> 
> To Ruby, that’s an assignment to a local variable, which then drops out  
> of scope. That’s why you have to do “self.name= value” to call the  
> method.

d’oh! of course 🙂

> If it really were private, you’d need
> 
> send(:name=, value)
> 
> although being private rather negates the purpose of an ‘accessor’ which  
> is to make values accessible 🙂

in this case, i only want the accessor to be acessible to the class and  
its  
subclasses, mainly because the subclasses need to be able to override  
the  
‘storage mechanism’ (ie: backing field vs hash or something)… it’s a  
bid  
of an edge-case though 🙂

> > when calling the private accessor without using self, its  
> > implementation  
> > clearly isn’t executed but no exception is raised either… why is that?
> 
> Because it’s perfectly legal to assign a value to a local variable 🙂

obviously 😛

---

<div class="post-metadata">

**Author:** ![Davy\_B](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/7ba0ec/32.png) [@Davy\_B](https://www.ruby-forum.com/u/Davy_B)\
**Post date:** [September 10, 2010, 5:04pm UTC](https://www.ruby-forum.com/t/calling-private-accessors/194784/4 "2010-09-10T17:04:44Z")

</div>

> in this case, i only want the accessor to be acessible to the class and its  
> subclasses, mainly because the subclasses need to be able to override the  
> ‘storage mechanism’ (ie: backing field vs hash or something)… it’s a bid  
> of an edge-case though 🙂

that is called ‘protected’ not ‘private’ - just that change should do  
it.

-a
