Bug #17093
closedattr_accessor works strange
Description
require 'rubygems'
class A
  def initialize(type:)
    @type = type
  end
  def b
    p type
    p type.nil?
    type = 'default' if type.nil?
    type
  end
  private
  attr_accessor :type
end
RSpec.describe A do
  let(:type) { 'whoaaa' }
  it 'return default' do
    expect(A.new(type: type).b).to eq('default')
  end
  it 'instance variable is "whoaaa"' do
    expect(A.new(type: type).instance_variable_get(:@type)).to eq(type)
  end
end
all tests green
output
A
"whoaaa"
false
  return default
  instance variable is "whoaaa"
        
           Updated by jeremyevans0 (Jeremy Evans) over 5 years ago
          Updated by jeremyevans0 (Jeremy Evans) over 5 years ago
          
          
        
        
      
      - Status changed from Open to Feedback
Do you expect the type = 'default' in b to set the @type instance variable to 'default'?  If so, that doesn't work, you need to use self.type = instead of type =.  If not, can you provide an explanation of what behavior you are expecting?
        
           Updated by mpavel (pavel m) over 5 years ago
          Updated by mpavel (pavel m) over 5 years ago
          
          
        
        
      
      seriously?
attr_accesor doesnot provide value?
        
           Updated by jeremyevans0 (Jeremy Evans) over 5 years ago
          Updated by jeremyevans0 (Jeremy Evans) over 5 years ago
          
          
        
        
      
      - Status changed from Feedback to Closed
In Ruby type = 'default' only sets a local variable named type.  It does not call the type= method on self, you need self.type = 'default' for that.
See https://ruby-doc.com/docs/ProgrammingRuby/html/tut_expressions.html, specifically the section on "Sidebar: Using Accessors Within a Class".
        
           Updated by mpavel (pavel m) over 5 years ago
          Updated by mpavel (pavel m) over 5 years ago
          
          
        
        
      
      you doesnt see "if type.nil?" its local variable?
p type.nil? return false
next "if type.nil?" return true and "type = 'default'" will work
why?
        
           Updated by Hanmac (Hans Mackowiak) over 5 years ago
          Updated by Hanmac (Hans Mackowiak) over 5 years ago
          
          
        
        
      
      This:
if type.nil?
 type = 'default'
end
is different from this:
type = 'default' if type.nil?
because of the lexical reading, it reads the setting of local variable first and now assumes that type is local variable in this case
        
           Updated by nobu (Nobuyoshi Nakada) over 5 years ago
          Updated by nobu (Nobuyoshi Nakada) over 5 years ago
          
          
        
        
      
      - Description updated (diff)
- Status changed from Closed to Rejected
        
           Updated by nobu (Nobuyoshi Nakada) over 5 years ago
          Updated by nobu (Nobuyoshi Nakada) over 5 years ago
          
          
        
        
      
      - Has duplicate Bug #17096: attr_accessor doesnt work added
        
           Updated by mpavel (pavel m) over 5 years ago
          Updated by mpavel (pavel m) over 5 years ago
          
          
        
        
      
      are you try this solution?
if type.nil?
 type = 'default'
end
just test it )