2013-07-29 13 views
5

क्या किसी विधि में पैरामीटर x को परिभाषित करना संभव है, जैसे कि x का प्रकार एक सामान्य प्रकार T है जो किसी दिए गए फ़ंक्शन हस्ताक्षर को लागू करता है (हमें def apply() : Double कहें), बिना किसी परिचय के नया प्रकार?स्केल और किसी दिए गए ऑपरेशन के साथ बाध्य प्रकार

[उदाहरण] लक्ष्य की तरह (मैं सिर्फ उदाहरण के लिए का सहारा वाक्य रचना का उपयोग कर रहा) कुछ परिभाषित करने के लिए है:

def foo(x : T with def apply() : Double) = { ... }

वर्तमान में, मैं एक नए प्रकार ApplyDouble परिचय सकता है, लेकिन है कि मुझे हर संभव प्रकार जिसका उदाहरणों 'foo' के लिए कानूनी मापदंड हैं विस्तार की आवश्यकता होगी, और foo के हस्ताक्षर तो

def foo(x : ApplyDouble) = { ... }

उत्तर

8

एस में बदल जाएगा ure, यह एक संरचनात्मक प्रकार के साथ संभव है, और तुम भी लगभग वाक्य रचना सही मिल गया है:

def foo(x: { def apply(): Double }) = x.apply 

और फिर:

scala> foo(() => 13.0) 
res0: Double = 13.0 

या:

scala> foo(new { def apply() = 42.0 }) 
res1: Double = 42.0 

foo की परिभाषा आपको प्रतिबिंबित पहुंच के बारे में चेतावनी देगा, जिसे आप एक आयात या कंपाइलर विकल्प जोड़कर बच सकते हैं (जैसा कि चेतावनी संदेश में वर्णित है)।

ध्यान दें कि संरचनात्मक प्रकार पर विधियों को कॉल करने में कुछ ओवरहेड शामिल हैं, इसलिए यदि आपको इसे एक कड़े आंतरिक लूप में चाहिए तो आप अपने दृष्टिकोण पर थोड़ा सा विचार करना चाहेंगे। ज्यादातर मामलों में, हालांकि, यह शायद एक उल्लेखनीय अंतर नहीं करेगा।

+0

धन्यवाद। यह वहीं है जिसे मैं ढूंढ रहा था ;) – leco

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