将`Unit`传递给Scala中的函数的目的是什么?

时间:2017-10-13 07:49:03

标签: scala

在SO中提到以下问题,将Unit传递给函数而不是()或反之亦然?

Functions without arguments, with unit as argument in scala

1 个答案:

答案 0 :(得分:1)

据我所知,你想知道这两个方法定义之间有什么区别,以及为什么会在函数参数中使用Unit over()。

def func1(f:Unit=>String) = {
  println(f)
}

def func2(f:()=>String) = {
  println(f)
}

通过查看此代码的输出可以突出显示差异:

func1(Unit => "hello")
func2(() => "hello" )

你可能会惊讶地看到这个输出:

<function1>
<function0>

Unit =&gt; String实际上是一个带有1个参数的函数。 While()=&gt; String是一个带0参数的函数。

在Scala()中可能意味着两件事

  • 它可用于单位,例如val x:Unit =()
  • 可用于表示无参数。

在func2中,它是一个没有参数的函数。

func1中的“Unit”实际上是scala包中的抽象类(其中只有一个值为“Unit”或“()”)。所以当函数Unit =&gt;字符串已定义,我们定义的是一个函数,它将Unit类型的参数作为参数,并返回一个值。不是不带参数的函数。

对代码的最后调整以突出差异:

def func1(f:Unit=>String) = {
  println(f(Unit))
}

def func2(f:()=>String) = {
  println(f())
  //println(f(Unit)) - does not compile
}


func1(Unit => "hello")
func2(() => "hello" )

两次输出你好。

我建议func2或()通常是人们想要的,而不是func1或“Unit”