在此代码段中,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中是否有var
和val
个关键字?
答案 0 :(得分:1)
变量是REBOL中一个丑陋的词,一切 - 甚至是单词 - 都是值。这不是一些语义新闻,它有助于理解REBOL的流动方式。
我认为值包含在内存中的一个巨型数组中,其中REBOL(该语言)使用单词及其上下文来引用和与值交互。大多数REBOL功能在不重复这些值的情况下运行:
head lowercase next uppercase str: "abcd"
remove back tail str
这是REBOL最有效的功能之一 - 您不需要需要副本用于中间过程,要求这样做是浪费。可以想象,每次使用replace
,uppercase
或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
当然,修改有其局限性。有时从头开始建造更清洁。
答案 1 :(得分:1)
您的驼峰案例函数对原始值进行操作,因此如果您想保留原始值,则需要复制它,并返回更改后的值。由于你的函数作用于模板,它需要复制模板吗?
所以,这样的事情应该有效:
fill-template-body: func[ labels [block!] /local field-labels-types vars fields-names-types][
field-labels-types: copy labels
..