我在Scala遇到奇怪的代码片段时很新:
class EndpointMapper[A](m: Method, e: Endpoint[A]) extends Endpoint[A] { self =>
/**
* Maps this endpoint to either `A => Output[B]` or `A => Future[Output[B]]`.
*/
final def apply(mapper: Mapper[A]): Endpoint[mapper.Out] = mapper(self)
final def apply(input: Input): Endpoint.Result[A] =
if (input.request.method == m) e(input)
else EndpointResult.Skipped
final override def toString: String = s"${ m.toString.toUpperCase } /${ e.toString }"
}
这是一个类,所以我可以创建它的一个实例。
那个apply
方法怎么样?
我可以像调用EndpointMapper(mapper)
方法的函数一样使用apply
吗?
如何区分两个应用程序或编译器如何知道,apply
应该调用哪个?
答案 0 :(得分:2)
您无法调用EndPointWrapper(mapper)
- 因为必须在随播对象而不是类上定义apply
。您可以做的是致电epw(mapper)
,其中epw
是EndPointWrapper
的实例。
如何区分两个应用程序或编译器如何知道,如果他调用哪个适用?
它根据参数的类型知道调用哪个版本的apply
,就像使用任何其他重载方法一样。