【问题标题】:Protecting object attributes in Rebol在 Rebol 中保护对象属性
【发布时间】:2013-07-02 17:29:47
【问题描述】:

我正在 Rebol 中尝试一些非常基本的东西。我想要一个简单的实例层次结构——一个question 基本实例和一些question 子实例。而且我想保护一些实例属性。

我现在做的是:

_question: make object! [
    id: none
    type: none
    text: none ]

    question-text: make _question [
        type: 'text

    new: func [
        id' [integer!]
        text' [string!]
    ] [
        make self [
            id: id'
            text: text'

            protect [ id type text ]
        ]
    ]
]

但是这失败了:

qt1: question-text/new 1 "q-text1"
qt2: question-text/new 2 "q-text2"

创建第二个实例 qt2 后,我得到:

脚本错误:Word id 受保护,无法修改

接下来的想法是将受保护的字段移出_question 并将它们放入question_text - 即使我不喜欢这样。但这只会导致同样的错误。

注意:我目前正在使用 Rebol2 执行此操作,但理想情况下也可以让我的东西在 Rebol3 和 Red 中运行。而且我想避免黑客攻击(当然 - 这很模糊,像 Python getitem()/setitem() 技巧之类的东西就可以了)。那么我希望这些字段不受保护。

【问题讨论】:

    标签: object rebol rebol3 rebol2 red


    【解决方案1】:

    这里有一些绑定注意事项。这可行,但受制于 Rebol 2 的 'protect 函数和上下文的古怪性质:

    new: func [
        id' [integer!]
        text' [string!]
        /local object
    ][
        object: make self []
        object/id: id'
        object/text: text'
        protect bind [ id type text ] 'object
        object
    ]
    

    【讨论】:

    • 请注意,这不会保护您免受new-question/id: 12 符号的影响,而只是do bind [id: 12] new-question
    • 谢谢!像宣传的那样工作,刚好低于黑客阈值;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-19
    • 2013-12-18
    相关资源
    最近更新 更多