如何在 Pike 中实现按引用传递?

How can I achieve pass-by-reference in Pike?

提问人:SwFly 提问时间:7/9/2023 最后编辑:SwFly 更新时间:7/10/2023 访问量:23

问:

任何可以提供帮助并熟悉派克语的人。

我目前正在学习派克语言,我想实现一个空函数来计算给定数字“N”的阶乘。“阶乘”函数应接受两个参数:“N”参数表示计算限制,以及“RESPONSE”参数,用于存储要返回给调用程序的计算阶乘值。

我已经进行了广泛的搜索,但我找不到任何关于在 Pike 中通过引用传递参数的信息。这似乎是一个相当晦涩难懂的话题,或者可能没有被广泛讨论。我尝试过各种参数传递技术,例如使用 “*”、“&”、“ref”、“object”、“array[][”,但不幸的是,它们都没有奏效。我甚至尝试模拟 TCL 语言中使用的引用传递样式,但它也未能产生预期的结果。

如果有人对如何在 Pike 中实现引用传递行为有任何见解或建议,我将非常感谢您的帮助。

void factorial (int N, ref int FAT) {
  for (int I = 1; I <= N; I++) {
    FAT *= I;
  }
}
通过参考 派克

评论

0赞 ruakh 7/9/2023
为什么要在输出参数中返回此值,而不是作为返回值?(顺便说一句,你似乎对派克有通过引用很有信心,我不明白为什么。大多数语言没有,尽管它们通常有其他方法来完成您可能使用传递引用的任何特定事情。
0赞 SwFly 7/9/2023
我想知道派克是否支持通过引用传递参数,例如 C(指针)和 C++(引用)。此外,Lua 是否可以返回多个结果,其中一些通过 return 语句,另一些通过引用?Lua 不能直接通过引用传递参数,但它允许函数返回多个结果并使用数组模拟通过引用传递行为。派克有类似的能力吗?
0赞 SwFly 7/9/2023
感谢您的互动。我是一个不轻易放弃的人,退出对我来说不是一种选择。我不仅确定在 Pike 中通过引用传递参数,而且我设法做到了,因为对我来说,一种语言不会提供一种发生它的方法对我来说是不可想象的。
0赞 SwFly 7/9/2023
又经过7个小时的研究和尝试,我终于发现了它,并决定通过这个渠道寻求帮助。Pike 不像其他语言那样直接进行参数传递,但它允许它通过数组进行,我将其作为我自己帖子的答案提供。

答:

1赞 SwFly 7/9/2023 #1

Pike 没有按引用传递,但它确实具有某些引用类型,这些引用类型始终通过指针隐式处理。例如,如果某个方法采用数组参数,则它实际上具有指向与调用它的代码相同的数组的指针,并且如果它改变该共享数组的任何元素,则结果将对该调用代码可见。因此,您可以使用单元素数组作为事实上的指针,如下所示:

void fatorial(int N, array(int) FAT) {
    FAT[0] = 1;
    for (int I = 1; I <= N; I++) {
        FAT[0] *= I;
    }
}

int main() {
    array(int) RESP = allocate(1);
    
    RESP[0] = 1;

    factorial(5, RESP);
    write("Factorial = " + RESP[0] + "\n");

    return 0;
}