有人能解释一下这里发生了什么吗?

时间:2011-09-06 15:57:47

标签: scala unit-type

以下是代码:

scala> def foo(bar: Unit => String) = {bar}
foo: (bar: (Unit) => String)(Unit) => String

scala> foo(a => a.toString)
res0: (Unit) => String = <function1>

我猜是一个类型为Unit,但不是Unit一个对象?单元类是隐藏的吗?

4 个答案:

答案 0 :(得分:4)

使用您的示例...

def foo(bar: Unit => String) = {bar}

这定义了foo方法,该方法接受从UnitString的函数作为其唯一参数,并简单地返回相同的参数。

foo(a => a.toString)

a => a.toString定义了一个内联函数。由于类型推断器知道此位置需要函数Unit => String,因此它会将a推断为类型Unit

这次foo的调用会返回您刚刚定义的匿名函数。

我很好奇,你究竟想要在这里实现什么?或者您只是在探索Scala的语法?

答案 1 :(得分:4)

UnitAnyVal,与Int类似。它的唯一成员是文字,写成()。例如:

scala> def foo(bar: Unit => String) = {bar}
foo: (bar: Unit => String)Unit => String

scala> foo(a => a.toString)
res0: Unit => String = <function1>

scala> res0(())
res1: String = ()

答案 2 :(得分:2)

在Scala中Unit等同于Java的void。您已定义了一个函数,该函数接受另一个没有参数的函数,并返回String

这相当于def foo(bar: => String);def foo(bar: () => String)

在Scala ()Unit

的快捷方式

答案 3 :(得分:2)

Kevin Wright给出的答案是完全正确的,但要进一步分解:

第一行是声明一个名为foo的函数。 foo将另一个函数bar作为其参数,它本身接收Unit并返回String。一般来说,scala中的Unitvoid在许多其他语言中的含义相同,所以你可以说大多数情况bar是一个不带参数和返回的函数String

foo函数的主体只返回它收到的参数。因此,scala推断foo返回的函数需要Unit并返回String

第二个命令使用函数foo作为参数调用a => a.toString。假设a属于Unit类型。如果Unitvoid完全相似,则无效。没有东西你就不能打电话给toString。但是,Unit的行为略有不同,完全适用于此类情况,a将获得Unit的实例。这个实例实际上不会做太多,但它可以调用toString。因此第二个命令的结果将是一个函数,它返回toString实例上调用的Unit的结果,即: “()”