मैं थोड़ी देर के लिए स्कैला के साथ काम कर रहा हूं और इसके साथ 10,000+ लाइन प्रोग्राम लिखा है, लेकिन मैं अभी भी कुछ आंतरिक कार्यकलापों से उलझन में हूं। मैं जावा, सी और लिस्प के साथ पहले से ही घनिष्ठ परिचित होने के बाद पाइथन से स्कैला आया था, लेकिन फिर भी यह धीमा हो रहा है, और एक बड़ी समस्या यह है कि मुझे अक्सर निराशाजनक कठिनाई होती है जब वस्तुओं/प्रकारों के आंतरिक कार्यों की जांच करने की कोशिश की जाती है/वर्गों/आदि। पाइथन की तुलना में स्कैला आरईपीएल का उपयोग करना। पाइथन में आप foo
(प्रकार, ऑब्जेक्ट वैरिएबल, बिल्ट-इन फ़ंक्शन इत्यादि) का उपयोग करके foo
का उपयोग करके यह देखने के लिए type(foo)
का उपयोग करने के लिए किसी भी ऑब्जेक्ट की जांच कर सकते हैं, dir(foo)
आपको उन तरीकों को बताने के लिए जिन्हें आप कॉल कर सकते हैं अंतर्निहित दस्तावेज़ प्राप्त करने के लिए, और help(foo)
पर। re
नामक पैकेज पर प्रलेखन का पता लगाने के लिए आप help("re")
जैसी चीजें भी कर सकते हैं (जो नियमित रूप से अभिव्यक्ति ऑब्जेक्ट्स और विधियों को रखता है), भले ही इसके साथ कोई ऑब्जेक्ट न हो।ऑब्जेक्ट्स/प्रकार/आदि की जांच कैसे करें। स्कैला आरईपीएल से?
स्कैला में, आप ऑनलाइन दस्तावेज़ीकरण को आजमा सकते हैं और पढ़ सकते हैं, लाइब्रेरी में स्रोत कोड देख सकते हैं, लेकिन यह अक्सर उन चीजों के लिए बहुत कठिन हो सकता है जहां आप नहीं जानते कि वे कहां हैं या यहां तक कि वे क्या हैं (और यह अक्सर बड़े पैमाने पर पदानुक्रम को देखते हुए काटने के लिए एक बड़ा हिस्सा होता है) - सामान विभिन्न स्थानों (पैकेज scala
, Predef
, विभिन्न निहित रूपांतरणों, ::
जैसे प्रतीकों के आसपास तैर रहा है जो Google के लिए लगभग असंभव हैं)। आरईपीएल सीधे पता लगाने का तरीका होना चाहिए, लेकिन हकीकत में, चीजें कहीं अधिक रहस्यमय हैं। कहें कि मैंने कहीं foo
का संदर्भ देखा है, लेकिन मुझे नहीं पता कि यह क्या है। वहाँ जाहिरा तौर पर "व्यवस्थित आरईपीएल साथ स्काला थिंगी की जांच करने के लिए गाइड" एक जैसी कोई बात नहीं है, लेकिन अगले क्या मैं परीक्षण और त्रुटि के एक महान सौदा के बाद में इकट्ठा किया है:
- तो
foo
एक मूल्य के (है जो संभवतः चर और प्लस साथी वस्तुओं और अन्य स्कैलाobject
एस में संग्रहीत चीजों को शामिल करता है), आप सीधेfoo
का मूल्यांकन कर सकते हैं। यह आपको परिणाम के प्रकार और मूल्य बताना चाहिए। कभी-कभी परिणाम सहायक होता है, कभी-कभी नहीं। - यदि
foo
एक मान है, तो आप इसका प्रकार प्राप्त करने के लिए:type foo
का उपयोग कर सकते हैं। (जरूरी नहीं है।) यदि आप फ़ंक्शन कॉल पर इसका उपयोग करते हैं, तो आपको फ़ंक्शन कॉल किए बिना वापसी मान का प्रकार मिलता है। - यदि
foo
एक मूल्य है, तो आप अपनी कक्षा प्राप्त करने के लिएfoo.getClass
का उपयोग कर सकते हैं। (अक्सर पिछले की तुलना में अधिक प्रबुद्ध, लेकिन ऑब्जेक्ट की कक्षा इसके प्रकार से भिन्न कैसे होती है?) - कक्षा
foo
के लिए, आपclassOf[foo]
का उपयोग कर सकते हैं, हालांकि यह स्पष्ट नहीं है कि परिणाम का क्या अर्थ है। - सैद्धांतिक रूप से, आप कक्षा को अलग करने के लिए
:javap foo
का उपयोग कर सकते हैं - जो सभी का सबसे उपयोगी होना चाहिए, लेकिन मेरे लिए पूरी तरह से और समान रूप से विफल रहता है। - कभी-कभी आपको त्रुटि संदेशों से चीजों को एक साथ टुकड़ा करना होता है।
:javap
का उपयोग कर विफलता के
उदाहरण:
scala> :javap List
Failed: Could not find class bytes for 'List'
शिक्षाप्रद त्रुटि संदेश का उदाहरण:
scala> assert
<console>:8: error: ambiguous reference to overloaded definition,
both method assert in object Predef of type (assertion: Boolean, message: => Any)Unit
and method assert in object Predef of type (assertion: Boolean)Unit
match expected type ?
assert
^
ठीक है, अब के एक सरल उदाहरण कोशिश करते हैं।
scala> 5
res63: Int = 5
scala> :type 5
Int
scala> 5.getClass
res64: java.lang.Class[Int] = int
सरल पर्याप्त ...
अब, चलो कुछ वास्तविक मामलों में, जहां यह तो स्पष्ट नहीं है की कोशिश करते हैं:
scala> Predef
res65: type = [email protected]
scala> :type Predef
type
scala> Predef.getClass
res66: java.lang.Class[_ <: object Predef] = class scala.Predef$
इसका क्या मतलब है? Predef
का प्रकार type
का प्रकार क्यों है, जबकि कक्षा scala.Predef$
है? मैं इकट्ठा करता हूं कि $ वह तरीका है कि साथी वस्तुओं को जावा में shoehorned हैं ... लेकिन Google पर स्कैला दस्तावेज़ मुझे बताओ कि Predef
object Predef extends LowPriorityImplicits
है - मैं इसे आरईपीएल से कैसे घटा सकता हूं? और मैं इसमें क्या देख सकता हूं? यह मेरे बुरी उलझन में छोड़ दिया
scala> `::`
res77: collection.immutable.::.type = ::
scala> :type `::`
collection.immutable.::.type
scala> `::`.getClass
res79: java.lang.Class[_ <: object scala.collection.immutable.::] = class scala.collection.immutable.$colon$colon$
scala> classOf[`::`]
<console>:8: error: type :: takes type parameters
classOf[`::`]
^
scala> classOf[`::`[Int]]
res81: java.lang.Class[::[Int]] = class scala.collection.immutable.$colon$colon
ठीक है, है, और अंततः मैं यह सब की समझ बनाने के लिए स्रोत कोड को पढ़ने के लिए जाना था:
ठीक है, चलो एक और दुविधापूर्ण कोशिश करते हैं।
तो, मेरे सवाल कर रहे हैं:
- क्या आरईपीएल कक्षाएं, विधियों, आदि का उपयोग कर समझ बनाने के लिए की स्काला वस्तुओं, का सच स्काला विशेषज्ञों से सबसे अच्छा तरीका है की सिफारिश की है, या कम से कम उन्हें के रूप में की जांच आरईपीएल से सबसे अच्छा किया जा सकता है?
- मैं निर्मित उत्पादों के लिए REPL से काम कर रहे
:javap
कैसे प्राप्त करूं? (क्या यह डिफ़ॉल्ट रूप से काम नहीं करना चाहिए?)
किसी भी ज्ञान के लिए धन्यवाद।
एक भयानक लेख के लिए धन्यवाद! मैं 'शोआरओ' का भी उल्लेख करता हूं जिसे एम 4 जारी करने के कुछ ही समय बाद जोड़ा गया था (और कल एम 5 में दिखाई देगा)। यह किसी को कुछ प्रतिबिंब कलाकृतियों (पेड़ों और प्रकारों सहित) की आंतरिक संरचना का निरीक्षण करने देता है। –
@EugeneBurmako: मुझे 'ब्रह्मांड.शोराव' पता है जो एम 4 का सदस्य है, क्या आपका मतलब दूसरा 'शोआर' है? – sschaef
हाँ, मैं इस बारे में बात कर रहा हूं। एम 4 के रिलीज के कुछ दिनों बाद इसे काफी हद तक फिर से बनाया गया था। –