2014-10-09 2 views
3

Учитывая класс case, я хочу получить метод apply.Как получить метод apply класса case

я могу сделать A.apply _, но есть способ, чтобы получить его только с

Пример

scala> case class A(s: String) 
defined class A 

scala> def f[B, C](h: B => C) = h 
f: [B, C](h: B => C)B => C 

scala> f(A.apply _) 
res0: String => A = <function1> 

Можно просто написать f(A) или что-то подобное

ответ

3

Следующие работы для меня в Scala 2.11:

package sandbox 

object ApplyMethod { 
    import sandbox.OtherApplyTest.C 
    case class A(s: String) 

    object B { 
    def apply(s: String): A = A(s) 
    } 

    def D(s: String) = OtherApplyTest.D(s) 

    def f[T](h: String => T) = h("hello") 

    def g[T, U](h: T => U) = h 

    def main(args: Array[String]) { 
    println(f(A)) // prints A(hello) 
    // println(f(B)) doesn't compile 
    println(f(C)) // prints C(hello) 
    println(f(D)) // prints D(hello) 
    println(g(A)) // prints A 
    println(g(C)) // prints C 
    println(g(D)) // prints <function1> 
    println(f(g(A))) // prints A(hello) 
    } 
} 

object OtherApplyTest { 

    case class C(s: String) 

    case class D(s: String) 
} 

Выглядит как то, что вы хотите сделать (а также, как вы это сделали) Может быть, он не работает в REPL или в старой версии Scala.

2

Я никогда сталкиваются с ситуацией, когда Scala считает A(...) по-другому от A.apply(...). В моем интерпретатором, f(A) работает просто отлично:

scala> case class A(s: String) 
defined class A 

scala> def f[B, C](h: B => C) = h 
f: [B, C](h: B => C)B => C 

scala> f(A) 
res1: String => A = A 
Смежные вопросы