我在一些Scala代码中犯了类似下面的错误:
val someVal:String = if (someX == someY) n
Run Code Online (Sandbox Code Playgroud)
回想起来,错误对我来说很明显(它必须为someVal分配一些东西,如果表达式为false,它可能不会是一个字符串).我想知道如果表达式为false,返回的值是什么.我最好的猜测是单位,或者也许是AnyVal.
Tyl*_*ler 10
该代码不会编译,因为someVal要成为一个String,那么每个执行路径(if和else)都必须返回一个String.但是,由于你没有else,这是不可能的,因此不会编译.
编译器错误将是以下内容,表示Unit您应该返回时返回String:
error: type mismatch;
found : Unit
required: String
Run Code Online (Sandbox Code Playgroud)
那是因为你所拥有的相当于:
val someVal: String = if (foo == bar) "Hello World" else ()
Run Code Online (Sandbox Code Playgroud)
()是Unit的唯一值,它不是String类型的有效值.
在将来,您可以使用Scala repl并让它告诉您类型(只是不指定一个):
scala> val someVal1 = if (true) "Hello World"
someVal1: Any = Hello World
val someVal2 = if (false) "Hello World"
someVal2: Any = ()
Run Code Online (Sandbox Code Playgroud)
正如您所看到的那样,Any因为这是Unit和之间唯一的共同父类String: