Random Io中的随机值错误

Random Io中的随机值错误,random,iolanguage,Random,Iolanguage,我正在编写一个单元测试框架,它将提供随机整数、布尔值、字符和字符串来测试函数 Github回购协议:。有关守则: genChar := method( Random value(128) floor asCharacter ) genSeq := method(gen, len := Random value(100) floor 0 to(len) map(i, gen() ) ) genString := method( genS

我正在编写一个单元测试框架,它将提供随机整数、布尔值、字符和字符串来测试函数

Github回购协议:。有关守则:

genChar := method(
    Random value(128) floor asCharacter
)

genSeq := method(gen,
    len := Random value(100) floor

    0 to(len) map(i,
        gen()
    )
)

genString := method(
    genSeq(genChar) join
)

# below always has same genChar    
"Random string: #{genString}" interpolate println


genSeq
应使用生成器函数生成0到99个元素的随机序列。由于某种原因,当传递
genChar
时(请参见
example.io中的
genString
调用),
genSeq
在所有位置返回完全相同的元素。

传递的参数在调用它之前进行评估

注意。与Python或Javascript等语言不同,括号不用于调用该方法,而是在Io中用于向该方法发送消息。因此,
gen
gen()
是相同的,因为在使用时总是调用in-Io方法。您可以通过使用访问该方法,而无需调用它

注意。此链接指向的评论可能有助于:


一种解决方案是传递一个
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()
) 
另一种方法是延迟计算参数:

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
)

非常详细的解释。是的,将所有内容更改为块修复了错误。这些块对于forAll方法是必需的,它将接受一个生成器列表并多次调用它们来创建函数的测试值。
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
)
genChar := method(
    Random value(33, 128) floor asCharacter
)