Bug #10967
closedIs "warning: private attribute?" wrong?
Description
The following code ...
class Y
  def initialize
    @x = "ZOMG"
  end
  def print_x
    puts x
  end
  private
  attr_reader :x
end
Y.new.print_x
outputs ...
test.rb:12: warning: private attribute?
I tend to think this warning is wrong, I was surprised by https://github.com/rack/rack/pull/811 and I think this is a completely valid use case.
Also this code ...
class Y
  def initialize
    @x = "ZOMG"
  end
  def print_x
    puts x
  end
  def assign_x
    self.x = "ZOMG ZOMG"
  end
  private
  attr_accessor :x
end
y = Y.new
y.assign_x
y.print_x
Works fine with warnings also. So a private writer works ok when the receiver is self because Ruby has a special case for it, this make me think that private writers were thought to be used.
So ... am I wrong thinking that the warning should be removed or the self special case shouldn't work and be removed from Ruby code?. It doesn't make sense to me to have both things.
        
          
          Updated by spastorino (Santiago Pastorino) over 10 years ago
          
          
        
        
      
      One possible fix (the one removing the warning) ... https://github.com/ruby/ruby/pull/849
        
          
          Updated by nobu (Nobuyoshi Nakada) over 10 years ago
          
          
        
        
      
      - Description updated (diff)
 
It's valid in your case, but may not in others.
It doesn't sound enough reason to remove that warning to me.
If you want to suppress the warning, you can explicitly do it after the definition.
class Y
  attr_writer :x
  private :x=
end
        
          
          Updated by marcandre (Marc-Andre Lafortune) over 10 years ago
          
          
        
        
      
      FWIW, I feel that warning should be removed. There are too many false positives, and I suspect very very few cases where that warning is of any help. Note that without the warning, it will be obvious anyways when calling that reader/writer that it fails because it is private.
        
          
          Updated by spastorino (Santiago Pastorino) over 10 years ago
          
          
        
        
      
      There's also a discussion going on in another PR, https://github.com/ruby/ruby/pull/889
@nobu (Nobuyoshi Nakada), not sure what are the invalid use cases you refer to, and also what if I need to use let's say 2 private accessors? should I do ...
  attr_accessor :a, :b
  private :a, :a=, :b, :b=
Doesn't sound great to me.
        
          
          Updated by matz (Yukihiro Matsumoto) over 10 years ago
          
          
        
        
      
      We haven't thought of self as a receiver. Agreed to remove warnings.
Matz.
        
          
          Updated by zzak (zzak _) over 10 years ago
          
          
        
        
      
      - Status changed from Open to Closed
 
Applied in changeset r50585.
- 
vm_method.c: Remove private attribute warning [Bug #10967]
Patch by @spastorino [Fixes GH-849]
https://github.com/ruby/ruby/pull/849 - 
test/ruby/test_module.rb: Update test for changes
 
        
          
          Updated by usa (Usaku NAKAMURA) over 10 years ago
          
          
        
        
      
      - Backport changed from 2.0.0: UNKNOWN, 2.1: UNKNOWN, 2.2: UNKNOWN to 2.0.0: WONTFIX, 2.1: REQUIRED, 2.2: REQUIRED
 
        
          
          Updated by usa (Usaku NAKAMURA) over 10 years ago
          
          
        
        
      
      Is this a spec change or a bug?
        
          
          Updated by nagachika (Tomoyuki Chikanaga) about 10 years ago
          
          
        
        
      
      - Backport changed from 2.0.0: WONTFIX, 2.1: REQUIRED, 2.2: REQUIRED to 2.0.0: WONTFIX, 2.1: REQUIRED, 2.2: WONTFIX
 
Hmm, I don't know it's a bug fix or a spec change, but I think it's a trivial issue. I decided to not to backport to 2.2. Please notice if any objections.
        
          
          Updated by usa (Usaku NAKAMURA) about 10 years ago
          
          
        
        
      
      - Backport changed from 2.0.0: WONTFIX, 2.1: REQUIRED, 2.2: WONTFIX to 2.0.0: WONTFIX, 2.1: WONTFIX, 2.2: WONTFIX
 
Ok, I follow you, chikanaga-san!