Random Io中的随机值错误
我正在编写一个单元测试框架,它将提供随机整数、布尔值、字符和字符串来测试函数 Github回购协议:。有关守则: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
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
)