scala - 当类型别名有换行符且没有等号时,为什么 scala 会计算类型别名?

标签 scala types scala-repl

我注意到在 REPL 中声明类型别名时,换行符会导致语句成功:

这有效:

scala> type a
     | 3 == 3
defined type alias a
res32: Boolean = true

这不会:

scala> type a 3 == 3              ^
       error: `=`, `>:`, or `<:` expected

最佳答案

如图所示,具有抽象类型是合法的。

REPL 处于一种特殊的解析模式,它知道当前行是否是完整的语法生成式或者是否需要更多输入,因此这就是它转到第二行的原因,即使从技术上讲它应该只接受 输入一个

scala> object X { type a }
defined object X

scala> object X { def x: Int }
                      ^
       error: only traits and abstract classes can have declared but undefined members

scala> type a
     | 42
defined type alias a
res0: Int = 42

scala> def x: Int
     | 42
           ^
       error: only traits and abstract classes can have declared but undefined members

REPL 不会将抽象 typedef 导入当前表达式,因为它知道它是抽象的。

该类型可能不是很有用,但它是一个东西:

scala> object X { type a }
defined object X

scala> val x: X.a = null.asInstanceOf[X.a]
x: X.a = null

scala> def x: X.a = ???
x: X.a

scala> def x: X.a = null
                    ^
       error: type mismatch;
        found   : Null(null)
        required: X.a

关于scala - 当类型别名有换行符且没有等号时,为什么 scala 会计算类型别名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60402306/

相关文章:

scala - 为什么 Scala 选择在变量名之后使用类型?

scala - 在 Scala 中,如何重新分配元组值?

arrays - 处理多种类型和数组时如何编写 "good"Julia代码(多重分派(dispatch))

haskell - 在 Haskell 中跨应用程序是否保留了类型相等性?

c++ - 基于 32 位和 64 位系统的 C 或 C++ 语言的数据类型大小有何不同

scala - 是否可以通过 Scala REPL shell 命令打开交互式 vim 进程?

scala - 为什么在 Scala REPL 中以下会抛出异常?

scala - scala 中的 void 函数等效吗?

scala - 使用 Play 2.0 创建 Web 服务

scala - 从 CLI 快速切换 Scala 版本