Scala 的哪些特性允许 Props[SomeActor] 语法
What feature of Scala allows for Props[SomeActor] syntax
我一直忽略的 Akka 的一个方面出现在规范的 Hello World 中!例子。即,创建 Props
class:
的语法
val props = Props[MyActor]
Q. Scala 中的什么机制允许以这种方式指定类型参数(即 [MyActor]
)?我假设这被转换为 Props
上的 constructor/apply 方法,该方法采用 Class
参数?例如,我的猜测是它等同于:
val props = Props(classOf[MyActor])
我一直假设 classOf
是 "special" 并以某种方式作弊以使用 []
语法。因为我看到第 3 方库 Akka 使用相同的语法,所以看到一个简单的 REPL 示例会很棒,它演示了我如何将这种语法用于我自己的 classes。
Props 的实例最终是以下情况 class (https://github.com/akka/akka/blob/0511b07f3e50e0422379075ae76dd158e4d377fa/akka-actor/src/main/scala/akka/actor/Props.scala#L115):
final case class Props(deploy: Deploy, clazz: Class[_], args: immutable.Seq[Any])
由于这是一个案例class,scala 将生成
的默认apply
方法
Props.apply(deploy: Deploy, clazz: Class[_], args: immutable.Seq[Any])
Props
伴生对象还有其他几个 apply
方法,它们使用默认的应用方法为您创建此 class 的实例。在Props[MyActor]
的情况下,这是方法:
def apply[T <: Actor: ClassTag](): Props = apply(defaultDeploy, implicitly[ClassTag[T]].runtimeClass, List.empty)
Props[MyActor]
是 Props.apply[MyActor]()
的语法糖。所以Props
是利用ClassTag
的反射能力来获取MyActor
的运行时class,所以可以满足[=]的参数clazz: Class[_]
14=]案例class.
这是Scala ClassTag
机制。例如:
object Test {
def apply[T: ClassTag](s: String): Option[T] = ...
}
val foo = Test[Foo]("foo")
在 apply
方法中,您可以简单地执行类似
的操作
val ctor = implicitly[ClassTag[T]].runtimeClass.getConstructors.head
例如,为了访问 T
的第一个构造函数。
我一直忽略的 Akka 的一个方面出现在规范的 Hello World 中!例子。即,创建 Props
class:
val props = Props[MyActor]
Q. Scala 中的什么机制允许以这种方式指定类型参数(即 [MyActor]
)?我假设这被转换为 Props
上的 constructor/apply 方法,该方法采用 Class
参数?例如,我的猜测是它等同于:
val props = Props(classOf[MyActor])
我一直假设 classOf
是 "special" 并以某种方式作弊以使用 []
语法。因为我看到第 3 方库 Akka 使用相同的语法,所以看到一个简单的 REPL 示例会很棒,它演示了我如何将这种语法用于我自己的 classes。
Props 的实例最终是以下情况 class (https://github.com/akka/akka/blob/0511b07f3e50e0422379075ae76dd158e4d377fa/akka-actor/src/main/scala/akka/actor/Props.scala#L115):
final case class Props(deploy: Deploy, clazz: Class[_], args: immutable.Seq[Any])
由于这是一个案例class,scala 将生成
的默认apply
方法
Props.apply(deploy: Deploy, clazz: Class[_], args: immutable.Seq[Any])
Props
伴生对象还有其他几个 apply
方法,它们使用默认的应用方法为您创建此 class 的实例。在Props[MyActor]
的情况下,这是方法:
def apply[T <: Actor: ClassTag](): Props = apply(defaultDeploy, implicitly[ClassTag[T]].runtimeClass, List.empty)
Props[MyActor]
是 Props.apply[MyActor]()
的语法糖。所以Props
是利用ClassTag
的反射能力来获取MyActor
的运行时class,所以可以满足[=]的参数clazz: Class[_]
14=]案例class.
这是Scala ClassTag
机制。例如:
object Test {
def apply[T: ClassTag](s: String): Option[T] = ...
}
val foo = Test[Foo]("foo")
在 apply
方法中,您可以简单地执行类似
val ctor = implicitly[ClassTag[T]].runtimeClass.getConstructors.head
例如,为了访问 T
的第一个构造函数。