Project

General

Profile

Bug #9907

Updated by nobu (Nobuyoshi Nakada) over 10 years ago

This looks like a hole in the specification: 

 ~~~ruby ~~~ 
 private def foo=(*) end 
 public    def foo; 0    end 

 self.foo =    42 

 self.foo += 42 
 # private method `foo=' called for main:Object (NoMethodError) 

 private :foo 

 self.foo += 42 
 # private method `foo' called for main:Object (NoMethodError) 
 ~~~ 

 There is an exception for `private` writers in the rule for private message sends, but apparently that exception needs to broadened so that it also works in the case of abbreviated assignments. I'm not entirely sure what this rule would be, but I don't think it would break backwards compatibility, since all situations that would work differently with the changed rule would currently raise a `NoMethodError` anyway. 

 The rule should be something like: 

 > * `private` methods can only be called without an explicit receiver. 
 > * An exception is made for method assignments, where the literal receiver `self` is also allowed in the assignee method expression. 
 > * This also applies to compound assignments: `self.foo ω= bar` shall *always* succeed if either or both of `foo` and `foo=` are `private`.

Back