मुझे एक ऐसे प्रोजेक्ट में कुछ मैक्रोज़ को एकीकृत करना होगा जो केक-पैटर्न का उपयोग कर रहा है। उस पैटर्न ने हमें अन्य फायदों के साथ आयात के ज़िलियन से बचने की इजाजत दी, इसलिए हम इसे रखना चाहते हैं। अब, हम कुछ प्रयोगात्मक मैक्रोज़ के साथ एक समस्या का सामना कर रहे हैं जो हम ट्रंक के बाहर परीक्षण कर रहे हैं। सबसे पहले, के एक डमी प्रणाली केक नामित दिखाते हैं:क्या केक-पैटर्न और मैक्रोज़ को एकीकृत करना संभव है?
trait APiece {
class A
}
trait BPiece { this: APiece =>
def aMacro(a: A): Unit =() /* macro ??? */
}
trait CPiece { this: APiece with BPiece =>
def aMacroInvoker = aMacro(new A)
}
class Cake { this: APiece with BPiece with CPiece => }
प्रत्येक एक वर्ग को परिभाषित करता, BPiece एक मैक्रो जो प्रत्येक परिभाषित वर्ग का उपयोग करता है माना जाता है, और अंत में, CPiece मैक्रो invokes। मैंने कहा कि बीपीस एक मैक्रो होना चाहिए क्योंकि मैं इसके लिए कार्यान्वयन कोड करने में असमर्थ था। मैं कई तरीके की कोशिश की है लेकिन मैं हमेशा निम्न त्रुटि के साथ दुर्घटना:
"macro implementation must be in statically accessible object"
पढ़ना macros code एक अनुमान लगा सकते हैं कि यह एक स्थिर मॉड्यूल में मैक्रो संलग्न करने की आवश्यक है। क्या सिस्टम संरचनाओं का उपयोग करने वाले मैक्रो को तैनात करने का कोई तरीका है?
मुझे नहीं लगता कि उसकी समस्या हल हो जाती है, और मुझे कुछ भी नहीं लगता है। केक पैटर्न का सार - जैसा कि आपको पता होना चाहिए! :-) - "क्लाइंट" कोड में इच्छित परतों को चुनने में सक्षम है। यदि 'मैक्रोज़ स्थिर है, तो आप इसे इच्छानुसार स्विच नहीं कर सकते हैं। आप स्रोत फ़ाइलों या वर्ग फ़ाइलों को स्विच कर सकते हैं, लेकिन आप कोड लिख नहीं सकते जो कहता है "यह यहां से मैक्रोज़ का उपयोग करेगा, और इससे वहां से मैक्रोज़ का उपयोग किया जाएगा"। –
बढ़िया, मुझे लगता है कि नई समस्याएं उत्पन्न होंगी, लेकिन अब तक मैं इस समाधान के साथ आगे बढ़ सकता हूं। आपका बहुत बहुत धन्यवाद!डैनियल, हमारी प्रणाली मैक्रोज़ के साथ वास्तव में (केक-पैटर्न) शुद्ध नहीं होने वाली है। हम ग्राहक को यह तय करने की अनुमति देंगे कि क्या वह उनका उपयोग करना चाहता है या नहीं। तो, मुझे उम्मीद है कि यह काफी अच्छा होगा। – jeslg
@ डैनियल सी। सोब्राल I हालांकि विचार केक के अंदर एक मैक्रो घोषित करना था। यदि आपके पास अलग-अलग परतें हैं जो विभिन्न मैक्रो कार्यान्वयन का जिक्र करते हुए मैक्रोज़ को परिभाषित करती हैं, तो आप उनके बीच स्विच कर सकते हैं और अलग-अलग व्यवहार प्राप्त कर सकते हैं। –