Actions
Feature #8804
openONCE syntax
    Feature #8804:
    ONCE syntax
  
Description
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¶
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.¶
Actions
        
        
     Updated by Anonymous
          Updated by Anonymous