scala - 作为 AnyRef 传递的伴随对象的静态断言

标签 scala static-assert

对于类似 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/

相关文章:

c++ - 浮点类型的编译时操作

c++ - 是否有满足 C99 标准的 static_assert 替代品?

c++ - 在类中使用 static_assert - 如何?

scala - 为什么 scalac 提示 String 上的方法 +?

scala - Spark RDD未从Elasticsearch获取所有源字段

scala - Akka - 您应该创建多少个 Actor 实例?

scala - Gatling 场景,每小时 10 个请求(少于 1 rps)

scala - 在 Play 框架中使用 Scala Future?

c++ - 在编译时触发 void constexpr?

c++ - static_assert 意外行为