我正在使用以下代码通过foreach循环向视图添加多个GUI元素:
myRange: function [n][ ; to produce a vector of [1 2 3 4... n]
vv: make vector! n
i: 1
foreach j vv [
vv/:i: i
i: i + 1
if i > n [break]]
vv ]
view collect[
foreach i myRange 10 [
print append "i in loop: " i
keep [ t: text ] keep append "message number: " i
keep [field "entry" button "Click" [t/text: "clicked"] return]
] ]
正在制作所有GUI元素。但是代码append "message number: " i
在所有文本元素中显示i的值为12345678910
,而对于不同的文本元素则不是1,2,3 ... 10。
此外,print append...
语句正在产生以下输出:
i in loop: 1
i in loop: 12
i in loop: 123
i in loop: 1234
i in loop: 12345
i in loop: 123456
i in loop: 1234567
i in loop: 12345678
i in loop: 123456789
i in loop: 12345678910
此外,单击任何按钮只会更改最后添加的文本元素的文本。
问题出在哪里?如何解决?谢谢你的帮助。
编辑:似乎该语言正在转换我的代码:
for i 1 10 1 [
print append "i in loop: " i ]
到:
a_variable: "i in loop"
for i 1 10 1 [
print append a_variable i ]
这不是我和(我认为)大多数用户想要的。在大多数语言中,字符串“i in loop”将被视为常量,而不是转换为变量,因为用户没有指定它。恕我直言,如果不改变这些基本惯例,其他语言的用户将更容易来到这里。
答案 0 :(得分:4)
每当您看到类似的内容时,就意味着您无法创建新系列并重新使用现有系列。
要解决此问题,您需要使用copy
例如
print append copy "i in loop: " i
Rebol3 / ren-c不再出现此问题,因为源代码是不可变的,因此您将收到包含此类代码的错误消息。
答案 1 :(得分:3)
如果你没有通过copy
,make
等重新初始化,那么Rebol和Red会尽可能多地重复使用系列(例如字符串,块)。所以如果你的话你的问题就会消失写
append copy "message number: " i
答案 2 :(得分:2)
正如其他答案所示,您只需使用一个字符串作为邮件,并且需要复制。
至于另一个问题 - 你应该仔细看看你正在生成的代码(正如我在别处建议的那样,你可以弹出一点PROBE
来检查{{1}的输出功能):
COLLECT
正如您所看到的,您不断重新分配[
t: text "message number: 1" field "entry" button "Click" [t/text: "clicked"] return
t: text "message number: 2" field "entry" button "Click" [t/text: "clicked"] return
t: text "message number: 3" field "entry" button "Click" [t/text: "clicked"] return
t: text "message number: 4" field "entry" button "Click" [t/text: "clicked"] return
t: text "message number: 5" field "entry" button "Click" [t/text: "clicked"] return
t: text "message number: 6" field "entry" button "Click" [t/text: "clicked"] return
t: text "message number: 7" field "entry" button "Click" [t/text: "clicked"] return
t: text "message number: 8" field "entry" button "Click" [t/text: "clicked"] return
t: text "message number: 9" field "entry" button "Click" [t/text: "clicked"] return
t: text "message number: 10" field "entry" button "Click" [t/text: "clicked"] return
]
,以便最终只涉及最后一张脸。
此处存在一些选项 - 最突出的是生成您为t
脸部指定的名称。在text
循环中:
FOREACH
请注意,为了简化块的创建,我使用了这一行:
keep compose/deep [
(to set-word! rejoin ["t-" i])
text (rejoin ["Message Number: " i])
field "entry"
button "Click" [
set in (to word! rejoin ["t-" i]) 'text "clicked"
]
return
]
这构成了(在第一个例子中):
set in (to word! rejoin ["t-" i]) 'text "clicked"
set in t-1 'text "clicked"
返回绑定到给定上下文(面对象IN
)的给定单词('text
),然后t-1
到SET
。< / p>
更新
此方法甚至不使用单词名称,只需使用通用父级将按钮连接到标签:
"clicked"