2011-07-05 19 views
6

में सशर्त संकलन मैं पुस्तकालय पर काम कर रहा हूं जो स्कैला 2.9 पर निर्भर करता है लेकिन केवल मामूली सुविधा के लिए। मैं 2.8 के साथ संगत संस्करण का प्रस्ताव देना चाहता हूं, लेकिन मैं दो कोड शाखा को बनाए रखना नहीं चाहता हूं। चूंकि मैं एसबीटी का उपयोग कर रहा हूं, इसलिए मैं इसे क्रॉस-संकलन सुविधाओं से लाभ प्राप्त करना चाहता हूं।स्कैला

हालांकि मुझे नहीं पता कि सशर्त संकलन के बराबर प्रदान करने का एक तरीका है, केवल कोड का एक टुकड़ा शामिल करने के लिए यदि स्कैला 2.9 का उपयोग किया जाता है। रिफ्लेक्सिविटी एक विकल्प हो सकता है (लेकिन कैसे?)।

संपादित करें: विशेषताएं जो मैं 2.9 में उपयोग कर रहा हूं वे नई sys पैकेज ऑब्जेक्ट हैं।

उत्तर

2

मैं इसे प्रतिबिंब के साथ मिल गया। तो अगर मैं sys.SystemProperties प्राप्त करना चाहते हैं, मैं कर सकते हैं:

try { 
    val k = java.lang.Class.forName("scala.sys.package$") 
    val m = k.getMethod("props") 
    // etc. 
} catch { 
    case _ => throw new UnsupportedOperationException("Only available with Scala 2.9") 
} 

लेकिन ऐसा उबाऊ और बदसूरत मुझे लगता है कि मैं उन सुविधाओं छोड़ देंगे है ...

+0

क्या आपको 'NoSuchMethodException' जैसी चीजें नहीं मिलनी चाहिए? –

+0

मैं सबकुछ पकड़ता हूं क्योंकि रिफ्लेक्सन के सभी चरणों के परिणाम अपवाद फेंक सकते हैं। – paradigmatic

+0

पर्याप्त मेला। उस तरह की चीजें करते समय मैं आम तौर पर इसे अधिक पारदर्शी बनाने के लिए 'InvocationTargetException' को अनचाहे करता हूं। –

1

इस ब्लॉग पोस्ट, जो बताती है कि metaprogramming साथ यह करने के लिए पढ़ें:

http://michid.wordpress.com/2008/10/29/meta-programming-with-scala-conditional-compilation-and-loop-unrolling/

+0

धन्यवाद! लेकिन चूंकि मैं कोड का संदर्भ दे रहा हूं जो स्कैला 2.8 में मौजूद नहीं है (संपादन देखें), यह संकलित नहीं होगा। – paradigmatic

+0

ओह। दरअसल, यह इस तकनीक के साथ काम नहीं करेगा ... –