2011-11-20 10 views
7

नीचे जेनेरिक register विधि को देखते हुए मैं := ऑपरेटर को प्रतीकात्मक उपनाम के रूप में परिभाषित करना चाहता हूं।स्केल में एक विधि उपनाम के रूप में ऑपरेटर को परिभाषित करने के लिए सबसे कम संकेत क्या है?

def register[Prop <: Property[_]](prop: Prop): Prop 

@inline 
final def :=[Prop <: Property[_]] = register[Prop] _ 

मूल रूप से मैं कुछ इस तरह लिखना चाहते थे:

val := = register _ 

लेकिन है कि मुझे समारोह हस्ताक्षर Nothing => Nothing देता है। मेरा अगला प्रयास इसे Prop प्रकार के साथ पैरामीटर करना था, लेकिन यह स्पष्ट रूप से केवल तभी काम करता है जब मैं इसे def बनाता हूं, जो टाइप पैरामीटर ले सकता है और उन्हें आगे भेज सकता है।

आदर्श रूप से मैं @inline एनोटेशन को छोड़ना चाहता हूं लेकिन मुझे यकीन नहीं है कि स्कैला कंपाइलर किस ऑब्जेक्ट कोड से बाहर निकलता है।

सबसे महत्वपूर्ण मेरा लक्ष्य यह := विधि नाम के अलावा register विधि के हस्ताक्षर के सभी भागों नकल और फिर बस बाद के पूर्व प्रतिनिधि जाने के लिए नहीं है।

उत्तर

2
def :=[Prop <: Property[_]](prop: Prop) = register(prop) 

काम करना चाहिए।

+0

डुप्लीकेट हस्ताक्षर वाले विधि प्रतिनिधिमंडल ठीक वही है जो मैं टालना चाहता था। मेरा अंतिम अनुच्छेद "सबसे महत्वपूर्ण ..." देखें। इसके अलावा मैं किसी भी तर्क को मैन्युअल रूप से अग्रेषित नहीं करना चाहता हूं। –

+0

@TimFriske दुर्भाग्य से, आपको यह करना होगा, अगर आप ऐसा करना चाहते हैं। –

1

मुझे विश्वास नहीं है कि आप जो भी कर रहे हैं उसे हासिल करने का कोई तरीका है (मूल रूप से alias आपको रूबी में देता है) क्योंकि यह वर्तमान में खड़ा है। autoproxy plugin इस तरह की समस्या का समाधान करने का प्रयास है, लेकिन यह अभी तक कंपाइलर प्लगइन में कोड उत्पन्न करने के साथ विभिन्न मुद्दों के कारण उत्पादन उपयोग के लिए तैयार नहीं है।

1

आप ऐसा कर सकते हैं:

def := : Prop => Prop = register 

तो मूल रूप से यहाँ आप प्रकार की एक समारोह (प्रोप => प्रोप) सिर्फ एक और समारोह का संदर्भ देता है परिभाषित करते हैं।

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

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