scala> val a = println("Hello World")
Hello World
a: Unit = ()
为什么a: Unit()
来了?我们已将一些值分配到val a
。
但如果我们喜欢
val a = "Hello World"
它只显示
a: String = Hello World
这里我们将一些字符串分配给val a。所以它给了那个。
在第一个中,内置函数println()被调用,它有一些值,它返回。是吗??
那么为什么出现a: Unit()
?
a:Unit()
表示 - 它可以返回任何东西!
答案 0 :(得分:2)
在scala中没有程序,只有函数。
该过程是返回类型单位的功能。
请参阅Martin Odersky的{45}幻灯片http://www.slideshare.net/Typesafe/scaladays-keynote / http://www.youtube.com/watch?feature=player_detailpage&v=kkTFx3-duc8#t=2674。
虽然你写的时候
val a = println("Hi")
它在内部扩展为
val a = { println("Hi") }
它就像是
的匿名版本def x() { println("Hi") }
val a = x()
删除了所有“糖”的x()的完整版本是
def x():Unit = { println("Hi") }
在Scala控制台中将Unit值压缩为()。
所以当你写“紧凑版”时,你有:
val a = println("Hi")
Hi <-- result of the call to the println in the stdout
a:Unit = () <-- here a - name of variable,
Unit = type of the a variable,
and the () is the current value of a
答案 1 :(得分:1)
如果您习惯使用C或Java,则单元类型就像void一样,您刚才给出的两个示例之间的差异是println
什么都不返回,在Scala中,返回类型由最后执行的操作给出。如果您跟进println
函数,您将获得java定义:
public void println(Object paramObject)
如前所述,其类型为void
。
单位返回类型的其他示例是:
for {
someValue <- someList
} // here the return type is unit because you are missing the yield
val a = ()
第二个示例是值赋值,在Scala中键入val a = "some string"
时,编译器会自动推断出该变量的类型(在本例中为String)。
val someInt = 12 // Int
val someLong = 10L // Long
val someList = List("123", "456") // List[String]
答案 2 :(得分:1)
Scala包含一个名为Unit的特殊类型(它的类型同义词也是()),类似于Java的void,它表示没有返回值。 println函数将其参数打印到默认输出设备(stdout)并且不返回任何内容。
现在,如果在输入中指定值,则repl将打印每个已定义变量的值,例如:
scala> val x = 5; val y = 1;
x: Int = 5
y: Int = 1
在您的情况下,您指定了println的返回值,即前面提到的Unit。换句话说,“Hello World”是println和a的结果:Unit =()是在repl中执行赋值的结果。