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

Когда 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 слово или уточнение, но, похоже, оно не работает в моем случае. система Атроникс 3.0.0.4.40:

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

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


person Luis    schedule 28.07.2015    source источник


Ответы (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:
person HostileFork says dont trust SE    schedule 28.07.2015
comment
Что произойдет, если вы o: Освободите место [ ]. У 'O есть полная функциональность или нет? - person endo64; 30.07.2015