मैं सरल स्केला लिपियों कि अंत की तरह args
पर एक साधारण पैटर्न मैच के साथ शुरू के एक नंबर लिखने में त्रुटि संदेश देना तर्कों की गलत संख्या, मुझे एक अचूक त्रुटि मिलती है जैसे:पैटर्न मैच args और एक हल्के स्काला स्क्रिप्ट
scala.MatchError: [Ljava.lang.String;@7786df0f
at Main$$anon$1.<init>(FollowUsers.scala:5)
...
क्या कोई और उपयोगी त्रुटि संदेश देने का कोई आसान तरीका है? मेरे वर्तमान वैकल्पिक हल की तरह कुछ करने के लिए है:
args match {
case Array(path, foo, whatever) => someFunction(path, foo, whatever)
case _ => System.err.println("usage: path foo whatever")
}
def someFunction(path: String, foo: String, whatever: String) = {
// .. rest of the script uses "path", "foo", etc.
}
लेकिन उस बॉयलरप्लेट का एक बहुत की तरह लगता है क्या एक पूरी अन्य समारोह को परिभाषित करने के लिए, और "पथ", "foo" और "जो कुछ भी" को दोहराने के लिए होने के साथ इतने सारे स्थान क्या कोई बेहतर तरीका है? मुझे लगता है कि मैं समारोह खो सकता हूं और शरीर को मैच स्टेटमेंट में डाल सकता हूं, लेकिन यह मेरे लिए कम पठनीय लगता है।
मुझे पता है कि मैं कई कमांड लाइन तर्क पार्सिंग पैकेजों में से एक का उपयोग कर सकता हूं, लेकिन मैं वास्तव में बहुत हल्का वजन ढूंढ रहा हूं कि मुझे निर्भरता जोड़ने और मेरे क्लासपाथ को संशोधित करने की आवश्यकता नहीं है।
try {
val Array(path, foo, whatever) = args
} catch {
case _: MatchError => System.err.println("usage: path foo whatever")
}
हाँ, मुझे लगता है कि यह ठीक है, हालांकि आपको एक सीधा त्रुटि संदेश के बजाय एक स्टैक ट्रेस मिलेगा। – Steve
यही 'आवश्यकता' के लिए है। जैसे 'की आवश्यकता है (args.length == 3," तर्कों में XYZ को कॉल में लम्बाई तीन होना चाहिए ") ' –
" आवश्यकता "वाला संस्करण अच्छा और सरल है। हालांकि आपको इसके साथ एक सुंदर वर्बोज अपवाद मिलता है: 'java.lang।IllegalArgumentException: आवश्यकता विफल: उपयोग: पथ foo जो कुछ भी (और फिर सभी सामान्य ट्रेसबैक)। स्कैला डेवलपर को सही समझ में आता है, लेकिन किसी ऐसे व्यक्ति के लिए थोड़ा भ्रमित हो सकता है जो स्कैला को नहीं जानता लेकिन सिर्फ मेरी स्क्रिप्ट का उपयोग करना चाहता है। – Steve