gpt4 book ai didi

rebol - 为什么我需要在使用 call/wait/output 重定向 shell 之前初始化 var

转载 作者:行者123 更新时间:2023-12-01 11:05:15 25 4
gpt4 key购买 nike

如果我尝试下面的代码:

call/wait/output {webrequest http://google.com login password} content

REBOL 报错。相反,我必须使用以下内容:

content: ""
call/wait/output {webrequest http://google.com login password} content

为什么?

更新:我认为答案很简单......

最佳答案

“为什么?”是个棘手的问题!我会尝试给出一个理由...

当从一个应该收集数据并将其返回的函数传回一个值时,有两个基本选项(在大多数语言中)。

一种是将其用作返回。 (在像 Rebol 和 Ruby 这样的语言中,隐式返回是代码块中最后一条语句的计算结果。)另一种返回数据的方法是将它放入调用者“通过引用”或“通过”传递的参数中指针”。

call 的当前设计是它返回进程的退出代码。但是让我们想象一个替代宇宙,其中对 /outputcall 的改进改变了返回值,它可能看起来像这样:

>> call {echo "test"}
== 0

>> call/output {echo "test"}
== [0 "test"] ; in an alternate universe...

设计选择不是这样做的。 call always 返回简单的退出代码。相反,如果您关心调用的 /output,您可以通过引用传递一个参数...Rebol 会将控制台结果写入其中。

它非常灵活,因为 Rebol 允许您(例如)传入一个参数,该参数是一个打开的文件以写入结果...而不是让您存储一个可能非常大的函数返回值然后将其写出. call 应该写入文件还是将结果放入字符串由“by reference”参数的数据类型决定。

简而言之,这是语言的设计决定。 Rebol 不是假设输出应该去哪里,而是“嗅探”参数类型并做适当的事情。如果您还没有为 content 建立数据类型……它就无法工作。同样,如果我们考虑一个“替代宇宙”,call 可能有不同的改进:

call/outputstring {echo "test"} content

然后它就不必担心 content 之前是否声明过,调用会假定它应该将内容转换为字符串。如果您正在写入一个文件,它可以为您创建它……就像这样:

call/outputfile {echo "test"} %/myfile.txt content

但这不会让您写入已存在文件的任意位置,或现有字符串中的位置。简而言之,要求预先声明 content 可以解决这个问题。但是正如您所注意到的,它需要更多的代码。如果您愿意,您可以将声明放在行内:

call/output {echo "test"} content: {}

关于rebol - 为什么我需要在使用 call/wait/output 重定向 shell 之前初始化 var,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6478514/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com