在Scala中,val a =“Hello World”和val a = println(“Hello World”)之间的区别是什么

时间:2014-07-23 23:27:37

标签: scala read-eval-print-loop println

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()表示 - 它可以返回任何东西!

3 个答案:

答案 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中执行赋值的结果。