स्काला इन्फिक्स नोटेशन


12

क्या इन्फिक्स नोटेशन का उपयोग करके विधि को कॉल करना संभव है?

उदाहरण के लिए, हास्केल में, मैं निम्नलिखित फ़ंक्शन लिख सकता था:

x `isAFactorOf` y = x % y == 0

और फिर इसका उपयोग करें जैसे:

if 2 `isAFactorOf` 10 ...

जो कुछ मामलों में बहुत पठनीय कोड के लिए अनुमति देता है। क्या स्काला में ऐसा संभव है? मैंने "स्काला इन्फिक्स नोटेशन" की खोज की, लेकिन यह शब्द स्काला में कुछ अलग प्रतीत होता है।

जवाबों:


15

संस्करण 2.10 से शुरू करते हुए, स्काला ने इस मुद्दे को ठीक से संभालने के लिए निहित वर्ग पेश किए।

यह एक दिए गए प्रकार पर लिपटे हुए वर्ग पर एक अंतर्निहित रूपांतरण करेगा, जिसमें आपके अपने तरीके और मूल्य हो सकते हैं।

आपके विशिष्ट मामले में, आप कुछ इस तरह का उपयोग करेंगे:

implicit class RichInt(x: Int) {
  def isAFactorOf(y: Int) = x % y == 0
}

2.isAFactorOf(10)
// or, without dot-syntax
2 isAFactorOf 10

ध्यान दें कि जब संकलित किया जाता है, तो यह हमारे कच्चे मूल्य को बॉक्सिंग में समाप्त कर देगा RichInt(2)। आप अपने रिचइंट को उपवर्ग के रूप में घोषित करके इसे प्राप्त कर सकते हैं AnyVal:

implicit class RichInt(val x: Int) extends AnyVal { ... }

यह मुक्केबाजी का कारण नहीं होगा, लेकिन यह एक विशिष्ट अंतर्निहित वर्ग की तुलना में अधिक प्रतिबंधात्मक है। इसमें केवल विधियाँ हो सकती हैं, मूल्य या स्थिति नहीं।


2
आपको संभवतः उल्लेख करना चाहिए कि निहित वर्ग शीर्ष-स्तर नहीं हो सकते हैं, इसलिए अंतर्निहित वर्ग को स्थानीय रूप से परिभाषित करने की आवश्यकता होगी।
कारजेनिकेट

3

अनिवार्य रूप से, स्काला में आप एक इनफ़िक्स तरीके से फ़ंक्शन को कॉल नहीं कर सकते हैं, लेकिन आप एक विधि को एक प्रकार पर परिभाषित कर सकते हैं, जिसे बाएं तर्क को अंतर्निहित रूप में परिवर्तित किया जा सकता है। तो आपके उदाहरण के लिए, आप एक वर्ग को परिभाषित कर सकते हैं जिसमें एक विधि है isAFactorOf (एक Int ले रहा है) और यह दर्शाता है कि एक Int को इस वर्ग के उदाहरण में परिवर्तित किया जा सकता है।

यदि आप इस उत्तर को https://stackoverflow.com/a/3119671 किसी अन्य प्रश्न पर देखते हैं, तो आपको स्काला में वाक्य रचना दिखाई देगी जो समान रूप से काम करती है।


यह इंगित करने के लायक है कि स्काला के नए संस्करणों में स्पष्ट रूप से इसके लिए एक निर्माण है, जो जुड़ा हुआ उत्तर पता नहीं करता है implicit class RichInt(i: Int) { def square() = i * i }:।
KChaloux 13
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.