3

我在增加变量整数时遇到了一些麻烦。这段代码:

variable Integer myInteger = -1;
Integer getInteger () {
    myInteger = myInteger + 1;
    print("myInteger: " + myInteger.string);
    return Integer(myInteger);
}

Array<Integer> integers =
        Array.ofSize(
            4,
            getInteger());

print(integers);

给出这个输出:

myInteger: 0
{ 0, 0, 0, 0 }

而预期的输出是:

myInteger: 0
myInteger: 1
myInteger: 2
myInteger: 3
{ 0, 1, 2, 3 }

那是怎么回事?

4

2 回答 2

4

你的例子,我认为是人为的,可以写成Array(0:4)or Array(0..3)。但是假设你有充分的理由想要循环生成函数,我会这样写:

Array(loop(0)((i) => i+1).take(4))

或者,等效地:

Array(loop(0)(Integer.successor).take(4))

甚至:

Array(loop(0)(1.plus).take(4))

IMO,这比使用访问外部范围内的变量的流要好得多。

于 2017-09-09T11:20:22.153 回答
3

您已经发现这里发生了什么......构造函数Array.ofSize(n, val)正在创建一个填充n了相同值的数组。

一种做你想做的事情的方法可能是这样的:

Array<Integer> integers =
        Array({ getInteger() }.repeat(4));

试试看。

{ getInteger() }每次调用迭代器的 next 方法时,可迭代枚举中的表达式(这里是这里)都会被延迟评估(由于重复迭代 4 次,这里发生了 4 次)。

请注意,如果您改用序列枚举,它将不起作用[ ... ],它们是非惰性的。

于 2017-09-08T20:12:37.507 回答