2008-11-04 23 views
7
में एक संदर्भ में शब्दों को जोड़कर

निम्नलिखित REBOL कोड कल्पना कीजिए:गतिशील रूप REBOL

foo: context [bar: 3]

अब मैं एक संदर्भ foo जिसमें 'bar परिभाषित किया गया है है। मैं इस संदर्भ में एक नए शब्द को गतिशील रूप से कैसे इंजेक्ट कर सकता हूं? क्या यह संभव है?

मैं कोशिश की है:

set/any in foo 'baz 3

लेकिन है कि क्योंकि अभिव्यक्ति in foo 'baz विफल रहता है कोई शब्द 'bazfoo संदर्भ में परिभाषित किया गया है, क्योंकि वहाँ काम नहीं करता।

मैं जोड़ने चाहिए कि मैं एक तरह से यह करने के लिए एहसास इस प्रकार है:

foo-prototype: [bar: 3] 
foo: context foo-prototype 
foo: context head append foo-prototype [baz: 3]

लेकिन क्या आप foo के प्रोटोटाइप ब्लॉक करने के लिए पहुँच नहीं है तो क्या होगा?

उत्तर

8

आप एक नई ऑब्जेक्ट बनाने के लिए मौजूदा ऑब्जेक्ट को प्रोटोटाइप के रूप में उपयोग करके प्राप्त कर सकते हैं।

>> foo: make object! [bar: 3] 
>> foo: make foo [baz: 3] 
>> probe foo 
make object! [ 
    bar: 3 
    baz: 3 
] 
+1

यह आरईबीओएल के मौलिक पहलुओं में से एक है, लेकिन उस समय मैंने इस सवाल से पूछा, मुझे पता नहीं था कि आप ऐसा कर सकते हैं। –

4

वहाँ तथ्य यह है कि REBOL/2 में यह वस्तु संदर्भों का विस्तार करने के लिए सिर्फ posssible नहीं है आस-पास काम करने के लिए कई तरीके हैं।

शायद तुम सिर्फ वस्तु के स्थान पर ब्लॉक का उपयोग कर सकते रों रों:!

>> 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 

लेकिन तुम 'के रूप में कर सकते हैं OBJECT! s को विस्तारित करने के लिए कहा है, आप ऑब्जेक्ट को क्लोन करने के लिए पीटर डब्ल्यूए वुड के समाधान के लिए जा सकते हैं। बस ध्यान रखें कि इस दृष्टिकोण के साथ परिणामी क्लोन वास्तव में मूल वस्तु की तुलना में एक अलग बात है।

तो, अगर कुछ शब्द से पहले वस्तु धारण करने के लिए स्थापित किया गया है क्लोनिंग/विस्तार, उद्देश्य यह है कि शब्द अभी भी unextended वस्तु का आयोजन करेगा क्लोनिंग के बाद: आप रखने के लिए के लिए

>> 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 वस्तु रखते हुए विस्तार कर सकते हैं एक बाहरी वस्तु में बढ़ाने की जरूरत रैप करने के लिए चाहते हो सकता है आप कंटेनर के लिए केवल दुकान संदर्भ दी ।

REBOL/3, बीटीडब्ल्यू, शब्दों को ओबीजेक्ट में जोड़ने की अनुमति देगा!

+0

बहुत जानकारीपूर्ण जवाब! मैंने इस प्रश्न को पोस्ट करने के बाद से REBOL के बारे में एक टन सीखा है। –

1

REBOL/कोर उपयोगकर्ता गाइड में कहा:।। "कई ब्लॉकों अन्य ब्लॉक और स्ट्रिंग से युक्त जब इस तरह के एक ब्लॉक की नकल की है, इसकी उप-सीरीज की कॉपी नहीं किए जाते उप-सीरीज सीधे करने के लिए भेजा है और एक ही कर रहे हैं मूल ब्लॉक के रूप में श्रृंखला डेटा। "

+0

अगर मैं गलत हूं, तो मुझे सही करें, लेकिन क्या यह 'ऑब्जेक्ट' से संबंधित नहीं है! –