0

在此代码片段fields-types中,最终由to-camel-case函数修改,而不是作为局部变量传递给父函数:

fields-types: ["First Name" "string" "Last Name" "string" "Age" "int"]

to-camel-case: function [name] [
    name/1: lowercase name/1
    replace/all name space ""
]

fill-template-body: func [
    field-labels-types [block!] /local vars fields-names-types
] [
  vars: [member-name member-type]
  field-names-types: copy []
  foreach [field-label field-type] field-labels-types [
      append field-names-types to-camel-case field-label
      append field-names-types field-type
  ]
]

fill-template-body fields-types

执行给出:

>> fill-template-body fields-types
== ["firstName" "string" "lastName" "string" "age" "int"]
>> fields-types
== ["firstName" "string" "lastName" "string" "age" "int"]
>>

而我希望这些字段类型保持不变:

fields-types: ["First Name" "string" "Last Name" "string" "Age" "int"]

当然,我可以尝试通过修改to-camel-case以使用名称副本来规避这一点,但这不是我认为我应该做的事情。

Scala中是否有类似varand关键字的东西?val

4

2 回答 2

1

您的骆驼案例函数对原始值进行操作,因此如果您想保留原始值,您需要复制它,并返回更改后的值。由于您的函数作用于模板,因此需要复制模板对吗?

所以,这样的事情应该有效:

fill-template-body: func[ labels [block!] /local field-labels-types vars fields-names-types][
  field-labels-types: copy labels
..
于 2010-07-31T22:29:12.970 回答
1

变量在 REBOL 中是一个丑陋的词,一切——甚至是词——都是值。这不是一些语义新闻,它有助于理解 REBOL 的流动方式。

我认为值包含在内存中的一个巨大数组中,其中 REBOL(语言)使用单词及其上下文来引用值并与之交互。大多数 REBOL 函数在不重复这些值的情况下运行:

head lowercase next uppercase str: "abcd"
remove back tail str

这是 REBOL 最有效的功能之一 - 您不需要中间过程的副本,要求这样是浪费的。想想每次使用时该数组在哪里增长replaceuppercase或者to-camel-case一个值重复。整个过程可以在修改而不是重复的前提下构建 - 实际上可以构建上下文而不必返回值:

remove-spaces: use [space mark][
    space: charset " ^-"
    [any [mark: space (remove mark) | skip]]
]

parse/all str: "Should Be No Spaces" remove-spaces

然后诀窍就变成了知道在哪里复制值,我认为恰好与 REBOL 的简洁表达天赋相交:

parse/all link: copy title: "An Article on REBOL" remove-spaces
print ["(" link ")" title]

to-camel-case copy field-label

当然,修改也有其局限性。有时它是从头开始更清洁的建筑。

于 2010-07-31T18:05:21.427 回答