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内部のすべてQ object!が を返すことを期待しています"1234"が、誰もそれをしません。

何故ですか?

4

1 に答える 1

4

Rebol がオブジェクトを作成するとき、最初に仕様から (set-)words を収集し、それらを使用して新しいオブジェクトを作成します。新しいオブジェクトの単語は、最初に に割り当てられnoneます。その後、spec は新しいオブジェクトにバインドされ、評価されます。

最初の例ではqurl:、仕様に含まれていないため、オブジェクトの一部ではありません。代わりに 'global' を取得しますqurl。2番目の例でqurl 、オブジェクトの一部であり、で開始されnoneます。

2 番目の例で「グローバル」に関連付けられた値にアクセスするためのオプションは次の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
]
于 2015-07-08T19:20:27.360 に答える