您传递的参数genSeq
在调用它之前被评估。
注意。与 Python 或 Javascript 等语言不同,括号不用于调用方法,而是在 Io 中用于向方法发送消息。因此gen
和gen()
是相同的,因为在 Io 中方法总是在使用时被调用。您可以访问该方法而无需通过使用调用它getSlot
注意。这个指向Hacker News评论的链接可能会有所帮助: http://news.ycombinator.com/item?id= 1539431
一种解决方案是传递一个block()
(匿名函数),然后从内部调用它genSeq
:
genSeq := method (gen,
len := Random value(100) floor
0 to(len) map(i, gen call) // <= gen call ie. call the block
)
genString := method (
genSeq( block(genChar) ) join // <= wrapped in a block()
)
另一种选择是传递一个序列(字符串)并perform
在其上运行:
genSeq := method (gen,
len := Random value(100) floor
0 to(len) map(i, perform(gen)) // run string as method
)
genString := method (
genSeq( "genChar" ) join // method name is a sequence
)
另一种选择是懒惰地评估论点:
genSeq := method ( // no defined parameters. Lazy time!
len := Random value(100) floor
0 to(len) map(i, call evalArgAt(0)) // <= arg is evaluated here!
)
genString := method (
genSeq( genChar ) join
)
顺便说一句......为了避免控制字符,我也做了这个更改(找不到Random
对象的文档,但下面是一个随机猜测,它有效!)。
genChar := method(
Random value(33, 128) floor asCharacter
)