rebol - 不使用 "copy"处理字符串时到底发生了什么?

标签 rebol rebol3

下面这个函数的目的是返回一个在两个星号之间插入参数值的字符串。

star-name: func [name /local stars] [
    stars: "**"
    insert next stars name
    stars
]
print star-name "test" ;*test*
print star-name "this" ;*thistest*, but what I really want is *this*  

第二次调用该函数时,第一次调用的参数仍保持插入状态。我知道答案是使用copy "**"
我的问题是,不是在每次调用该函数时将stars变量重新分配给"**"吗?

最佳答案

对于该函数,只有一个“**”字符串定义。该定义仅由Rebol load函数使用一次,因为load仅运行一次以将代码转换为Rebol内部形式-一个块。的确,如果两次调用该函数,赋值就会发生两次,但是赋值不会创建任何东西,只会使变量再次引用相同的字符串。

在注释中,您应该注意到实际上有两个“**”字符串定义,导致load创建了两个字符串。如果您使用

code: [stars: "**" insert next stars something]
something: "this"
do code
something: "that"
do code

您会注意到只有一个字符串定义,并且当您没有任何函数时,其行为与使用函数时的行为相同。

关于rebol - 不使用 "copy"处理字符串时到底发生了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18141674/

相关文章:

constructor - TO 和 MAKE 的目的有何不同,它们记录在何处?

rebol - 当可能有嵌入 block 时如何使用load/next/error?

rebol - 从 Rebol 中的系列中删除重复的对象

dll - 如何使用 LibFFI 支持构建 Rebol 的 "Ren-C"分支?

rebol - 使用绑定(bind)在 Red 中执行网络 I/O

rebol - 即使以编程方式也无法在受限的企业环境中设置代理密码

http - 如何仅使用 Rebol3 发送 HTTP POST 请求

rebol - 如何使用 Rebol 3 将 URL 传递给 cookie?

string - 如何在同一规则中混合字符串解析和 block 解析?