对于类似 akka 的框架,当发送或匹配(预期)伴生对象而不是案例类实例时,拼写错误是很常见的情况,反之亦然。 代码如下:
case class Foo()
...
def receive(ev: AnyRef) = {
...
case Foo() =>
// do some stuff
...
}
偶尔会这样发送:
actor ! Foo
而不是
actor ! Foo()
错误版本可以完美编译,但代码无法按预期工作(出于明显的原因)。
现在的问题:有没有办法指定一些静态(编译时)断言,伴生对象(可能除了“case object Foo”之外)无法传递给!运算符(operator)?对于类似接收的函数,也可以通过某种方式指定它不应包含它们的匹配案例。
或
某种防止声明无参数案例类的方法(强制这些案例的案例对象)。例如编译器选项将使“case class Foo()”非法,以强制使用“case object Foo”。但这并不能阻止使用 case Foo => 来代替 case Foo(_) => 用于带有参数的 case 类(用例:actor 可以重定向一些接收到的消息而忽略参数)。
最佳答案
几周前我遇到了类似的想法,以下是我的结论:
我不能真正强制 Akka 只考虑获取某种类型的数据,而不覆盖框架的大部分内容或在接收和发送时实现我自己的检查。例如,您可以将发送操作包装在您调用的仅接受特定类型参数的方法中。
如果我正确理解你的第二个问题,你会希望禁止以下 val a = Foo
,但这实际上是不可能的,因为 Scala 可以让一个值保存一个类型。
在创建我自己的框架实现和包装我的发送调用之间,我选择了包装我的发送和询问调用的方法,正如我所说,这些方法只接受某种类型的参数。效果很好。像这样的东西:
def customSend[T <: MyType](msg: T) =
actor ! msg
希望这有帮助。
关于scala - 作为 AnyRef 传递的伴随对象的静态断言,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27605102/