Возвращать только слова объекта, но не функции, определенные с двоеточием в качестве суффикса

Когда object! создается как показано ниже:

REBOL []


Room: make object! [
    price: copy ""
    area: copy ""

    total: func [] [
        price * 2
    ]

    set 'total2 func [] [
        price * 3
    ]
]

Результат probe Room является:

make object! [
    price: ""
    area: ""
    total: make function! [[][
        price * 2
    ]]
]

Функция total: печатается, но функция total2 не является. У меня есть скрипт, где я сохранил map! как серия repend [hash Room], Прежде чем я добавил функцию total, Room объект будет возвращать только слова, как

make object! [
    price: ""
    area: ""
] 

После добавления total функция, она также возвращается, и это изменяет вывод, который я хотел бы избежать. Итак, кроме смены total: в set 'total есть ли способ вернуть только предыдущий вывод?

В книге Rebol/Saphir есть /display Слово или уточнение, но это не похоже на работу в моей системе Atronix 3.0.0.4.40:

** Script error: cannot access display in path Room/display

Так что делать? Создать map! из price, area а его значения?

1 ответ

Решение

Функция total: печатается, а функция total2 - нет.

В обязательном порядке, ваш total2 связан с окружающим контекстом... не объектом. Так что, если вам нужно запустить это из консоли:

>> Room: make object! [
    price: copy ""
    area: copy ""

    total: func [] [
        price * 2
    ]

    set 'total2 func [] [
        price * 3
    ]
]

>> probe :total2
make function! [[][price * 3]]

Похоже, вы делали это в первую очередь, потому что хотели "скрыть" функции от выходных данных объекта, но при этом они все еще были там. Как правило, это не лучшая идея для проверки или отладки-дампа объекта как способа его сериализации, если вы не хотите видеть функции.

С технической точки зрения, как объекты работают в Rebol: когда вы помещаете значения членов функции в подобный объект, они действительно являются уникальными функциями. Таким образом, у каждого из объектов с членом-функцией есть копия тела, слова которого привязаны к идентификатору слов этого экземпляра объекта. В то время как небольшая загадка производительности, каждый объект должен быть полностью независимым, но каждый из них может быть настроен. Но если это проблема для ваших целей, то вы бы оставили свои функции вне объекта.

Если это не проблема, вам, вероятно, следует написать функцию сериализации для тех случаев, когда вас беспокоит, что функции просто находятся в объекте.

Хотя это не то, что вы ищете в этом случае, я упомяну кое-что классное... ЗАЩИТА / СКРЫТЬ

>> Room: make object! [
    price: $1'000'000.99
    area: 20x40

    total: func [] [
        price * 2
    ]

    sneaky: does [total]
]

>> protect/hide 'room/total

>> room
== make object! [
    price: 1000000.99
    area: 20x40
    sneaky: make function! [[][total]]
]

>> room/total
** Script error: cannot access total in path room/total

>> room/sneaky
== 2000001.98

Это способ удаления объектов из видимости или привязки, но все ранее существующие привязки все равно будут работать. И если вы используете его как родительский объект для MAKE!, скрытые элементы все еще будут там:

>> o: make Room [price: $304 area: 10x20]
== make object! [
    price: $304
    area: 10x20
    sneaky: make function! [[][total]]
]

>> o/sneaky
== $608

>> o/total
** Script error: cannot access total in path o/total

>> o/total: does [print "can't overwrite it, either!"]
** Script error: cannot access total in path o/total:
Другие вопросы по тегам