我想要的是以下内容:
class Foo(val f: (Bar => A) => A) {
def consume(x: Int): Unit = {
val myStr: String = f(bar => bar.getStr)
val myInt: Int = f(bar => bar.getInt)
writeToLog(s"$myStr: ${myInt + x}")
}
}
我知道我可以通过使用带有类型参数的apply方法为f
定义类型来实现此目的。我的问题是,如果不定义这样的类型,我能实现这一目标吗顺便说一句,我没有直接使用Bar
,因为每个Bar
都是一个rpc对象(例如节俭),我已经设置并拆除了我用这种模式避免的样板代码。
答案 0 :(得分:0)
我不确定它究竟是你需要的,但我可以建议使用无形的多态函数:
import shapeless._
import poly._
class Bar {
def getStr = "str"
def getInt = 1
}
type Extractor[T] = Bar => T
object extract extends Poly1 {
implicit def caseStr = at[Extractor[String]](f => f.andThen(identity))
implicit def caseInt = at[Extractor[Int]](f => f.andThen(identity))
}
class Foo(bar: Bar) {
def e[T](f: Bar => T): Extractor[T] = f
def consume(x: Int): Unit = {
val myStr: String = extract(e(_.getStr)) apply bar
val myInt: Int = extract(e(_.getInt)) apply bar
println(s"$myStr: ${myInt + x}")
}
}
new Foo(new Bar).consume(1)
所以你需要为每个case(String,Int等)定义函数。而我只使用了身份。在你的例子中,你永远不会传递Bar,但你在某些时候肯定需要它来计算String和Int