Значение слова доступа внутри объекта

В интерпретаторе:

>>  qurl: "1234"
== "1234"

>> R: make object! [probe qurl qq: qurl probe qq]
"1234"
"1234"
== make object! [
    qq: "1234"
]

Это ведет себя так, как я ожидал. Все «переменные» или «слова» по умолчанию являются глобальными.

С помощью скрипта:

REBOL []

qurl: "1234"

Q: make object! [
    probe join "[Q before qq] qurl: " qurl
    qq: qurl
    probe join "[Q] qq: " qq
    qurl: qurl
    probe join "[Q after qurl] qurl: " qurl
]
probe join "[main before Q] qurl: " qurl
Q
probe join "[main after Q] qurl: " qurl

возвращает:

"[Q before qq] qurl: none"
"[Q] qq: none"
"[Q after qurl] qurl: none"
"[main before Q] qurl: 1234"
"[main after Q] qurl: 1234"

Я ожидал, что все probe внутри Q object! вернут "1234", но никто этого не делает.

Почему это?


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


Ответы (1)


Когда Rebol создает объект, он сначала собирает (набор) слов из спецификации и использует их для создания нового объекта. Слова нового объекта изначально назначаются none. Затем спецификация привязывается к новому объекту и оценивается.

В вашем первом примере вы не включили qurl: в свою спецификацию, поэтому она не является частью вашего объекта. Вместо этого вы получаете «глобальный» qurl. Во втором примере qurl является частью вашего объекта и инициируется с помощью none.

Ваши варианты доступа к значению, связанному с «глобальным» qurl во втором примере:

1. Скомпонуйте блок так, чтобы при оценке блока он напрямую обращался к значению:

Q: make object! compose [
    qq: (qurl)
    qurl: (qurl)
]

2. Доступ к слову из «глобального» контекста:

Q: make object! [
    qq: system/words/qurl ; Rebol 2
    qq: system/contexts/user/qurl ; Rebol 3
]
person rgchris    schedule 08.07.2015
comment
В примере 1 скобки являются своего рода оценкой? - person Luis; 09.07.2015
comment
@luis Да — compose — это незаменимая функция, которая позволяет вам предварительно обрабатывать блок контролируемым образом. Это похоже на reduce, за исключением того, что только paren! значения внутри блока уменьшаются. - person rgchris; 09.07.2015