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/