scala - Scala 的常规赋值与提取器赋值不平衡的原因是什么?

标签 scala scala-2.11

Scala 对于常规值赋值与提取过程中的赋值似乎具有不同的语义。由于我的代码库随着时间的推移而迁移,这给我带来了一些非常微妙的运行时错误。

举例说明:

case class Foo(s: String)

def anyRef(): AnyRef = { ... }

val Foo(x) = anyRef() // compiles but throws exception if anyRef() is not a Foo

val f: Foo = anyRef() // does not compile

我不明白为什么两个 val 赋值行在编译/运行时行为方面会不平衡。

有些我很好奇:这种行为有原因吗?这是提取实现方式中不良的结果吗?

(在 Scala 2.11.7 中测试)

最佳答案

是的,有。

对于提取器,您可以指定希望在此位置匹配的模式。这被转换为从 Any 到 Option[String] 的提取器方法的调用,并且可以使用您提供的 AnyRef 类型的值来调用该方法。您只是断言,您确实得到了结果,而不是“无”。

在另一行中,您使用类型注释,即您显式指定“f”的类型。但随后您分配了一个不兼容的值。

当然,编译器可以添加隐式类型转换,但使类型转换如此简单并不真正适合像 Scala 这样的语言。

您还应该记住,提取器与类型无关。在模式 Foo(x) 中,名称 Foo 与类型 Foo 无关。它只是提取器方法的名称。

以这种方式使用模式当然是一个相当动态的功能,但我认为这是故意的。

关于scala - Scala 的常规赋值与提取器赋值不平衡的原因是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35584749/

相关文章:

Scala.js 导出抽象 val/var

mysql - 使用 Scala 从一个平台查询另一个平台

Scala unapplySeq提取器语法

java - 如何更新elasticsearch数组内的嵌套文档

scala - Akka Http 客户端在 HttpRequest 上设置 Cookie

scala - 是否可以在 Scala 中表达等效的 kotlin 'with' 方法?

postgresql - Joda DateTime 到 java.sql.Timestamp 忽略时区?

scala - 为什么 Def.inputTask 宏在 Scala 2.11.1 中不起作用?

scala - Custom Slick Codegen 在 `${container} trait` 之外生成映射的案例类?

java - 如何为 Java 8 LocalDateTime 编写自定义序列化器