2011-10-07 11 views
6

मैं अपने परीक्षण/डीबग चक्र में कुछ अंतःक्रियाशीलता जोड़ने की कोशिश कर रहा था, इसलिए मैंने स्कैला आरईपीएल से अपनी कक्षाओं के साथ खेलने की कोशिश की। यह बहुत अच्छा काम करता है लेकिन नुकसान यह है कि मैं पैकेज- और निजी स्तर के सदस्यों तक नहीं पहुंच सकता, जिसे यूनिट टेस्ट से परीक्षण किया जा सकता है (यदि परीक्षण एक ही पैकेज में है)।आरईपीएल में डिफ़ॉल्ट (पैकेज) या निजी एक्सेस स्तर वाले सदस्यों का उपयोग कैसे करें?

क्या मैं स्कैला आरईपीएल के पैकेज "संदर्भ" को "सेट" कर सकता हूं?

मैं मैं के सदस्यों तक पहुँचने के लिए प्रतिबिंब इस्तेमाल कर सकते हैं लगता है, लेकिन यह इतना टाइपिंग है यह पहली जगह में आरईपीएल का उपयोग कर का उद्देश्य विफल हो जाएगा।

उत्तर

1

क्या आपका मतलब है कि आप package object में परिभाषित सदस्यों तक नहीं पहुंच सकते हैं? आप

import mypackage._ 

या बस पहले से जुड़ा हुआ प्रपत्र mypackage.mymember(...) का उपयोग कर उन तक पहुँचने का उपयोग कर इन सदस्यों आयात कर सकते हैं।

5

मुझे लगता है कि आप जिस कक्षा में परीक्षण कर रहे हैं उसे जावा में लिखा गया है क्योंकि आपको केवल स्कैला में पैकेज बनाने के लिए अपने रास्ते से बाहर जाना है।

संक्षेप में, यह संभव नहीं है। आरईपीएल में प्रत्येक पंक्ति को अपने पैकेज में लपेटा जाता है, इसलिए इसे किसी अन्य पैकेज से दूसरे पैकेज-केवल सदस्य तक पहुंचने की अनुमति नहीं दी जाएगी। हालांकि डिफ़ॉल्ट पैकेज का नाम रैपिंग के लिए इस्तेमाल किया उपसर्ग बदलने के लिए एक गैर-दस्तावेजी प्रणाली संपत्ति है, पैकेज का नाम अभी भी एक नंबर incrementing द्वारा स्वचालित रूप से उत्पन्न होता है:

$ scala -Xprint:parser -Dscala.repl.naming.line=foo.line 
scala> val x = 1 
[[syntax trees at end of parser]]// Scala source: <console> 
package foo.line1 { 
    object $read extends scala.ScalaObject { 
    // snip ... 
    object $iw extends scala.ScalaObject { 
     // snip ... 
     object $iw extends scala.ScalaObject { 
     // snip ... 
     val x = 1 
     } 
    } 
    } 

मान लिया जाये कि यह कुछ आप अक्सर करते है, तो आप क्या कर सकता है एक फ़ाइल बना रही है जो प्रतिबिंब का उपयोग करने में आसान बनाती है और फिर इसे :load कमांड का उपयोग करके आरईपीएल में लोड करती है।

संबंधित मुद्दे