문제
다음 리볼 코드를 상상해보십시오.
foo: context [bar: 3]
이제 상황이 있습니다 foo
그곳에서 'bar
정의됩니다. 이 맥락에 새 단어를 동적으로 주입하려면 어떻게해야합니까? 가능합니까?
난 노력 했어:
set/any in foo 'baz 3
그러나 그것은 표현이기 때문에 작동하지 않습니다 in foo 'baz
단어가 없기 때문에 실패합니다 'baz
정의 foo
문맥.
나는 이것을하는 한 가지 방법을 알고 있다고 덧붙여 야한다.
foo-prototype: [bar: 3] foo: context foo-prototype foo: context head append foo-prototype [baz: 3]
그러나 접근 할 수 없다면 어떨까요? foo
의 프로토 타입 블록?
해결책
기존 객체를 프로토 타입으로 사용하여 새 개체를 만들어서 동일하게 달성 할 수 있습니다.
>> foo: make object! [bar: 3]
>> foo: make foo [baz: 3]
>> probe foo
make object! [
bar: 3
baz: 3
]
다른 팁
REBOL/2에서는 물체 컨텍스트를 확장 할 수 없다는 사실을 해결하는 방법에는 여러 가지가 있습니다.
아마도 당신은 객체 대신 블록을 사용할 수 있습니다! s :
>> blobject: [foo 1]
== [foo 1]
>> blobject/bar
** Script Error: Invalid path value: bar
** Near: blobject/bar
>> append blobject [bar 2]
== [foo 1 bar 2]
>> blobject/bar: 3
== 3
물체 자체를 추가하여 '자체적으로 작동 할 수도 있습니다.
>> insert blobject reduce ['self blobject]
== [[...] foo 1 bar 2]
>> same? blobject blobject/self
== true
그러나 당신이 확장을 요청했을 때 사물, 당신은 Peter Wa Wood의 솔루션으로 가서 간단하게 물건을 복제 할 수 있습니다. 이 접근 방식을 사용하면 결과 클론이 원래 객체와는 다른 것입니다.
따라서 클로닝/확장 전에 일부 단어가 객체를 고정 시키도록 설정된 경우, 객체를 복제 한 후 그 단어는 여전히 확장되지 않은 객체를 고정시킵니다.
>> remember: object: make object! [foo: 1]
>> object: make object [bar: 2]
>> same? remember object
== false
>> probe remember
make object! [
foo: 1
]
객체에 대한 "참조"를 그대로 유지하는 것이 필수적이라면, 당신은 당신이 바깥 물체에서 확장 해야하는 객체를
>> remember: object: make object! [access: make object! [foo: 1]]
>> object/access: make object/access [bar: 2]
>> same? remember object
== true
그런 다음 Safley는 컨테이너에 대한 참조 만 저장하는 경우 유지하는 동안 객체를 확장 할 수 있습니다.
BTW의 REBOL/3은 객체에 단어를 추가 할 수 있습니다!
REBOL/CORE 사용자 안내서에서 : "많은 블록에는 다른 블록과 문자열이 포함되어 있습니다. 그러한 블록이 복사되면 하위 시사는 복사되지 않습니다. 하위 시리즈는 직접 참조되며 원래 블록과 동일한 시리즈 데이터입니다. . "