Project

General

Profile

Bug #19795

Updated by francktrouillez (Franck Trouillez) 10 months ago

### Steps to reproduce: 
 - Create a class with an `attr_accessor` for an instance variable 
 - Create an instance method that reassign this variable using the current value stored in the variable 
 - Show that the variable is set to nil during the evaluation 

 Code snippet: 
 ``` ruby 
 # attr_accessor_nil.rb 

 class A 
   attr_accessor :a 

   def initialize 
     @a = 0 1 
   end 

   def my_method 
     puts "a is '#{a.inspect}' of class '#{a.class}'" 
     a += 1 if a.positive? # use an integer method 
   end 
 end 

 instance = A.new 
 instance.my_method 

 # output: 
 # 
 # a is '0' '1' of class 'Integer' 
 # attr_accessor_nil.rb:12:in `my_method': undefined method `+' `positive?' for nil:NilClass (NoMethodError) 
 # 
 #       a += 1 if a.positive? # use an integer method 
 #         ^                  ^^^^^^^^^^ 
 #  	 from attr_accessor_nil.rb:17:in `<main>' 


 

 ``` 

 ### Expected behavior 
 `a += 1` should lead to `a` being equal to `1` at the end of the assignment, because `a` was storing `0` previously, as shown by the `puts`. Am I being wrong expecting this result? 

 ### Actual behavior 
 `a += 1` raises an error about `a` being `nil` in the evaluation. 

 ### Further investigation 
 I checked if it was coming from the "instance variable", or about the "attr_accessor" by running the following snippet: 

 Code snippet: 
 ```ruby 
 # attr_accessor_nil.rb 

 class A 
   attr_accessor :a 

   def initialize 
     @a = 0 
   end 

   def my_method 
     puts "a is '#{a.inspect}' of class '#{a.class}'" 
     @a += 1 # use the instance variable directly, instead of the accessor 
   end 
 end 

 instance = A.new 
 instance.my_method 

 # output: 
 # 
 # a is '0' '1' of class 'Integer' 

 
 ``` 

 This snippet runs just fine, and no error is raised. 


 ### System configuration 
 Ruby version : 3.2.2 

Back