这个答案有点晚了,但也许有人会感兴趣。
您只需将代码的最后一行更改为:
c.call
此功能的应用之一是制作发电机。这是示例随机数生成器(取自 Numerical Recipies 书中的常量):
def randomLCG(a,m,c,seed)
initialized = false
while true
callcc {|x| $cc = x}
if not initialized
initialized = true
return
end
seed = (a*seed + c) % m;
return seed
end
end
和用法:
> randomLCG( 1664525, 2147483647 , 1013904223, 107 )
=> nil
> $cc.call
=> 1192008398
> $cc.call
=> 2079128816
> $cc.call
=> 667419302
在 Python 中,我们可能会使用关键字yield
来实现相同的目标(请注意,在 Ruby 中关键字yield
会做不同的事情):
def randLCG (a , m , c , seed):
while True:
seed = ( a∗seed + c ) % m
yield seed
用法:
>>> random = randLCG ( 1664525 , 2147483647 , 1013904223, 107 )
>>> random
<generator object randLCG at 0x7fdc790f70a0>
>>> random.next()
1192008398
>>> random.next()
2079128816
>>> random.next()
667419302
Ofc 在 Ruby ofc 中你可以使用闭包来解决这个问题,这样你的程序会更短:
require 'continuation'
def rand(a, m, c, seed)
return lambda{ seed = (a*seed + c) % m; return seed }
end
c = rand( 1664525, 2147483647 , 1013904223, 107 )
c.call
c.call
我想到的第二个用法是实现mutual recursions
。