Защита атрибутов объекта в Rebol

Я пробую что-то довольно простое в 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, я получаю:

Ошибка сценария: идентификатор слова защищен, не может быть изменен

Следующая идея - переместить защищенные поля из _question и поместить их в question_text - даже если мне это не нравится. Но это просто приводит к той же ошибке.

Примечание: в настоящее время я делаю это с помощью Rebol2, но в идеале я бы также запустил свои вещи в Rebol3 и Red. И я бы хотел избежать взломов (конечно - это расплывчато, вроде уловок Python getitem()/setitem() подойдут). Тогда я бы предпочел, чтобы поля были незащищенными.


person Frank Ruben    schedule 02.07.2013    source источник


Ответы (1)


Здесь есть некоторые обязательные моменты. Это работает, но зависит от причудливой природы 'protect функции Rebol 2 и контекстов:

new: func [
    id' [integer!]
    text' [string!]
    /local object
][
    object: make self []
    object/id: id'
    object/text: text'
    protect bind [ id type text ] 'object
    object
]
person rgchris    schedule 03.07.2013
comment
Обратите внимание, что это не защищает вас от new-question/id: 12 нотации, только do bind [id: 12] new-question. - person rgchris; 04.07.2013
comment
Спасибо! Работает как рекламируется и находится чуть ниже порога взлома;) - person Frank Ruben; 05.07.2013