VID布局窗格支持多个面部创建[rebol2]

rdo*_*iop 5 rebol rebol2

请考虑这个简单的rebol2代码来说明我的问题:

REBOL []
a: make face [
    offset: 0x0
    color: yellow
    size: 20x20
]
b: make face [
    offset: 0x0
    color: red
    size: 60x60
    pane: reduce [
        make a [offset: 0x0]
        make a [offset: 10x10]
        make a [offset: 10x20]
    ]
]
view layout [
    box 200x200 white with [
        pane: reduce [
            make b [offset: 0x30] ;; one 'instance' of b
        ]
    ]
]
Run Code Online (Sandbox Code Playgroud)

这里的要点是布局(或面)能够在其窗格块内显示一堆面,使得同一面(b在这种情况下)的多个创作应该是可能的.显示的代码运行良好,唯一的实例(让我称之为这种方式)b显示为应有的.

但现在假设我改变了代码,所以我有,比方说,2个实例b:

view  layout [
    box 200x200 white with [
        pane: reduce [
            make b [offset: 0x30]
            make b [offset: 0x10]
        ]
    ]
]
Run Code Online (Sandbox Code Playgroud)

此时我收到错误

** Script Error: Face object reused (in more than one pane): none
** Where: view
** Near: show scr-face
if new [do-events]
Run Code Online (Sandbox Code Playgroud)

从我在这里假设的那条消息来看,面孔b在某种程度上得到了重复使用并且正在弄清楚我正在努力实现的目标.我已经对此进行了大量的研究,并且在某些时候我发现可以通过克隆(使用make)要传递的面来绕过它pane; 这就是我以为我在做什么,但根本没有成功.

鉴于这种情况,我的问题是:我该如何解决这个问题?rebol2可以提供这种"面部实例化",或者最好在rebol2之外尝试别的东西(也许是rebol3)?

任何帮助将不胜感激.

小智 1

正如已经指出的,问题是a重用,而不是b

布局函数使用一个名为 的字段init来处理类似的事情。据我了解,它首先绑定到面部,然后在面部本身实例化(至少部分实例化)后init调用。do

在这种情况下,我将style在布局中使用命令(仍然部分使用面部对象a

view layout [
    style
        bb box 60x60
        with [
            append init [
                pane reduce [
                    make a [offset: 0x0]
                    make a [offset: 10x10]
                    make a [offset: 10x20]
               ]
            ]
        ]
    panel 200x200 white [
        at 30x0 bb
        at 0x0  bb
    ]
]
Run Code Online (Sandbox Code Playgroud)

另一种选择,与你的更相似一点是:

b: make face [
    offset: 0x0
    color: red
    size: 60x60
    init: [
        pane: reduce [
            make a [offset: 0x0]
            make a [offset: 10x10]
            make a [offset: 10x20]
        ]
    ]
]
view layout [
    box 200x200
    with [
        append init [
            pane: reduce [
                make b [ offset: 0x0 do init ]
                make b [ offset: 0x60 do init ]
            ]
        ]
    ]
 ]
Run Code Online (Sandbox Code Playgroud)

请注意,init在这种情况下,是在 make 子句中手动调用的。我不太确定为什么需要它。终于一切都可以优雅地解决了

view layout [
    style a box yellow 20x20
    style b panel red 60x60 [
        at 0x0 a   ; we can in this style use the just defined a style
        at 10x10 a
        at 10x20 a
    ]
    at 0x0 b
    at 0x60 b
]
Run Code Online (Sandbox Code Playgroud)