Red语言中的变量值

时间:2017-09-17 02:47:54

标签: loops user-interface rebol red

我正在使用以下代码通过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”将被视为常量,而不是转换为变量,因为用户没有指定它。恕我直言,如果不改变这些基本惯例,其他语言的用户将更容易来到这里。

3 个答案:

答案 0 :(得分:4)

每当您看到类似的内容时,就意味着您无法创建新系列并重新使用现有系列。

要解决此问题,您需要使用copy

创建新系列

例如

print append copy "i in loop: " i

Rebol3 / ren-c不再出现此问题,因为源代码是不可变的,因此您将收到包含此类代码的错误消息。

答案 1 :(得分:3)

如果你没有通过copymake等重新初始化,那么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-1SET。< / p>

更新

此方法甚至不使用单词名称,只需使用通用父级将按钮连接到标签:

"clicked"