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