Возвращать только слова объекта, но не функции, определенные с двоеточием в качестве суффикса
Когда 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: