Project

General

Profile

Bug #8444

Updated by nobu (Nobuyoshi Nakada) 6 months ago

=begin 
 In the docs for the Regexp special variables, `$~` $~ and friends, it says "These global variables are thread-local and method-local variables". However the following gives an unexpected result: 
   ```ruby 
   

   def get_proc 
     proc do |str| 
       str =~ /(.+)/ 
       sleep 0.1 
       puts "got #{$1} from #{str}\n" 
     end 
   end 
   proc = get_proc 
   t1 = Thread.new { proc.call "abc" } 
   t2 = Thread.new { proc.call "def" } 
   t1.join 
   t2.join 
   ``` 

 This outputs the following: 

   ``` 
   got abc from abc 
   got abc from def 
   ``` 

 The expected result is of course: 

   ``` 
   got abc from abc 
   got def from def 
   ``` 

 Clearly the variables are being scoped to the `get_proc` get_proc method and are being shared by both threads. This runs contrary to the documentation and also to expectations. 

 This behaviour should either be changed, or the documentation updated to reflect the actual behaviour. 

 Interestingly, the following does work as expected: 

   ```ruby 
   proc = proc do |str| 
     str =~ /(.+)/ 
     sleep 0.1 
     puts "got #{$1} from #{str}\n" 
   end 
   t1 = Thread.new { proc.call "abc" } 
   t2 = Thread.new { proc.call "def" } 
   t1.join 
   t2.join 
   ``` 
 

 =end

Back