Project

General

Profile

Feature #8804

Updated by Eregon (Benoit Daloze) 6 months ago

How about to introduce ONCE{...} syntax which do block only once and return the first value? 

 - It is similar of BEGIN{} and END{}. 
 - General syntax of /reg/o. 

 ## simulation code 
 ```ruby 
 ONCE_CACHE = {} 
 ONCE_MUTEX = Mutex.new 
 def ONCE(&b) 
   raise unless block_given? 
   ONCE_MUTEX.synchronize{ 
     key = caller(3, 1)[0] 
     if value = ONCE_CACHE[key] 
       value 
     else 
       ONCE_CACHE[key] = yield 
     end 
   } 
 end 

 3.times{|i| 
   p ONCE{ 
     i #=> every time 0 
   } 
 } 
 ``` 
 ## 
 ## Note that this code doesn't work if two or more ONCE{} are available in one line. 

Back