2012-04-06 7 views
5

पीछा कर रहा है एक मैनुअल प्रक्रियास्कैला में स्पष्ट वर्ग तर्क लेने के लिए कक्षा विधि को स्वचालित रूप से परिवर्तित करने का तरीका?

case class A(x: Int) { def f(y: Int) = x * y } 
val af: (A => Int => Int) = _.f 

val a = A(4) 
val r = af(a)(2) 

वहाँ af की तरह एक समारोह पाने के लिए एक conventient रास्ता नहीं है? A magic f की तरह कुछ, संभावित रूप से प्रतिबिंब का उपयोग किए बिना। import A#magic._ के माध्यम से कक्षा के सभी सार्वजनिक तरीकों को आयात करने की क्षमता एक बोनस है।

उत्तर

11

इस तरह 10 प्रतीकों कम है:

val af = (_: A).f _ 
2

आप एक का एक उदाहरण बना सकते हैं और तरीकों आयात कर सकते हैं:

val a = A(4) 
import a._ 

, ऐसा करने का कोई दूसरा रास्ता नहीं है क्योंकि x एक मूल्य धारण करने के लिए की जरूरत है। आप फिर भी बना सकते हैं एक सिंगलटन वस्तु के बजाय एक वर्ग वायुसेना और अपने विधि हस्ताक्षर उसके अनुसार बदल:

object A { 
    def f(x:Int)(y:Int) = x*y 
} 

import A._ 

जहां तक ​​मुझे पता है यह curried (constructor)(method signature) कार्यों में एक वर्ग के सभी तरीकों चालू करने के लिए संभव नहीं है।

2

मैं नहीं जानता कि क्यों यू कि चाहते हैं, लेकिन यू वास्तव में निम्नलिखित को प्राप्त कर सकते हैं:

scala> case class A(x:Int){ def f(y:Int)=x*y} 
defined class A 

scala> val af = A(2).f _ 
af: (Int) => Int = <function1> 

scala> af(3) 
res0: Int = 6 
संबंधित मुद्दे

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