我有这个基于Akka Concurrency预打印的问题(最终版本还没有),使用它时没有解释.
在课程的第1版中,他们有:
class Altimeter extends Actor with ActorLogging with EventSource{
...
}
Run Code Online (Sandbox Code Playgroud)
声称Altimeter现在与EventSource紧密结合,因此测试Altimeter还需要测试EventSource.修复建议的更改如下:
--- a/src/main/scala/Altimeter.scala
+++ b/src/main/scala/Altimeter.scala
@@ -9,9 +9,10 @@ import scala.concurrent.ExecutionContext.Implicits.global
object Altimeter{
case class RateChange(amount: Float) //sent to Altimeter
case class AltitudeUpdate(altitude: Double)
+ def apply() = new Altimeter with ProductionEventSource
}
-class Altimeter extends Actor with ActorLogging with EventSource{
+class Altimeter extends Actor with ActorLogging{ this: EventSource =>
import Altimeter._
val ceiling = 43000 //feet
diff --git a/src/main/scala/EventSource.scala b/src/main/scala/EventSource.scala
index 1fd5578..ded4f38 100755
--- a/src/main/scala/EventSource.scala
+++ b/src/main/scala/EventSource.scala
@@ -8,7 +8,12 @@ object EventSource{
case class UnregisterListener(listener: ActorRef)
}
-trait EventSource { this: Actor =>
+trait EventSource{
+ def sendEvent[T](event: T): Unit
+ def eventSourceReceive: Actor.Receive
+}
+
+trait ProductionEventSource { this: Actor =>
import EventSource._
Run Code Online (Sandbox Code Playgroud)
我的第一个问题是我不明白this: SomeTraitType =>
完成了什么.是字面意思是该类是SomeTraitType类型?
我的第二个问题是,它与使用之间有什么区别extends SomeTraitType
,为什么它有利?如果我知道前者的意思,那也许是显而易见的.
notation(this: EventSource => ...
)被称为"自我类型注释",它约束了特征可以混合到另一个继承结构中的方式.this
可以使用任何名称(不仅仅是).self
是另一个常见的.
这种用途或多或少是蛋糕图案(或其简化).使用该术语,您可以找到许多有助于解释其用法的资源.
自我类型注释的另一种用法(通常是无约束的,简单地self => ...
)为其创建别名this
,可以在外部this
被屏蔽的嵌套范围(嵌套类)中使用.
归档时间: |
|
查看次数: |
124 次 |
最近记录: |