2015-07-08 3 views
3

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

>> 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 внутри Qobject! вернется "1234", но никто не делает.

Почему?

ответ

4

Когда Rebol создает объект, он сначала собирает (set-) слова из спецификации и использует их для создания нового объекта. Первоначально слова нового объекта назначаются 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 
] 
+0

В примере 1., скобки являются своим родом оценки? – Luis

+0

@luis Да-'compose' - незаменимая функция, которая позволяет вам предварительно обработать блок контролируемым образом. Это похоже на 'сокращение', за исключением того, что только paren! значения внутри блока уменьшаются. – rgchris

Смежные вопросы