문제

다음 리볼 코드를 상상해보십시오.

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 사용자 안내서에서 : "많은 블록에는 다른 블록과 문자열이 포함되어 있습니다. 그러한 블록이 복사되면 하위 시사는 복사되지 않습니다. 하위 시리즈는 직접 참조되며 원래 블록과 동일한 시리즈 데이터입니다. . "

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top