也许这是一个愚蠢的问题,但我认为用法是合理和有用的,而不是当前检测隐式参数的方法。
有一个示例,从调用方检测隐式参数的方法是什么,首先给出代码:
package tagedfuture
class Future[+T](f: => T)(implicit tag: String) {
def map[B](f2: T => B): Future[B] = {
Future(f2(f))
}
def flatMap[B](f2: T => Future[B]): Future[B] = {
f2(f)
}
def getTag = tag
}
object Future {
def apply[T](f: => T)(implicit tag: String): Future[T] = new Future(f)
}
object Test extends App {
val fur = Future{
10
}("future-chain-1")
val fur2 = fur.map(x => x * 2)
val fur3 = fur2.flatMap(x => {
anotherFuture(x)(fur2.getTag)
// expect this:
// anotherFuture(x)
})
def anotherFuture(int: Int)(implicit tag: String): Future[String] = {
Future(int.toString)
}
// expect this:
//def anotherFuture(int: Int): Future[String] = {
// Future(int.toString)
//}
assert(fur.getTag == fur2.getTag && fur2.getTag == fur3.getTag)
}
tagedfuture.Future.apply
需要一个隐式参数来标记 Future 实例的来源。
在anotherFuture
方法中,它可以遵守,它有一个implicit tag: String
参数,用于在生成新的未来时传输标签。
我们必须为anotherFuture
附加隐式参数,因为编译器会检测方法上下文,从import package
,类定义位置。 但不通过其调用方进行验证。
支持如何检测来自调用方的隐式?
我们可以使用删除所有隐式样板代码的//expect this:
。即使我们删除了它,我们也可以从调用者那里获得隐式实例,其中首先是 fur1"future-chain-1"
Future
。
这似乎比目前的实现更困难。Scala 会支持这种使用隐式的方式吗?
更新
在编译器工作流方面,调用方检测的确切方法是什么?
目前,当我们定义一个方法时,它使用的方法有一个隐式参数,如def anotherFuture
,编译器将检查包含import pacakge
的方法上下文, 相对类/对象定义中的隐式变量,如果不是任何隐式变量,则报告错误以匹配方法需要。通过调用方
检测意味着编译器不检查方法定义位置的位置,而是检查调用方调用方法的位置。在此阶段,呼叫者位置是anotherFuture(x)(fur2.getTag)
。上下文包含Test
对象、fur2
实例和flatmap
方法。
我希望它将通过检测具有tag
变量的fur2
实例来编译。
它与以前不同,但在这个阶段,它可以顺便找到隐式内容,并提供一个优雅的代码来传输隐式上下文。
回顾一下,您希望编译器检查作用域中的每个变量(在调用具有隐式参数的方法的位置(,查找其类的任何(公共(成员,该成员本身标记为隐式并与预期类型匹配,以便将其作为隐式参数的参数提供给被调用的方法。
我认为这将是非常模棱两可的(如果你在范围内有两个Future[X]
实例,你会选择哪个隐式?(,大大减慢编译器的速度,并且根本不适合人脑。
所以,我的答案是否定的。(如果我正确理解了你的问题(