以下是代码:
scala> def foo(bar: Unit => String) = {bar}
foo: (bar: (Unit) => String)(Unit) => String
scala> foo(a => a.toString)
res0: (Unit) => String = <function1>
我猜是一个类型为Unit,但不是Unit一个对象?单元类是隐藏的吗?
答案 0 :(得分:4)
使用您的示例...
def foo(bar: Unit => String) = {bar}
这定义了foo
方法,该方法接受从Unit
到String
的函数作为其唯一参数,并简单地返回相同的参数。
foo(a => a.toString)
a => a.toString
定义了一个内联函数。由于类型推断器知道此位置需要函数Unit => String
,因此它会将a
推断为类型Unit
。
这次foo
的调用会返回您刚刚定义的匿名函数。
我很好奇,你究竟想要在这里实现什么?或者您只是在探索Scala的语法?
答案 1 :(得分:4)
Unit
是AnyVal
,与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中的Unit
与void
在许多其他语言中的含义相同,所以你可以说大多数情况bar
是一个不带参数和返回的函数String
。
foo
函数的主体只返回它收到的参数。因此,scala推断foo
返回的函数需要Unit
并返回String
。
第二个命令使用函数foo
作为参数调用a => a.toString
。假设a
属于Unit
类型。如果Unit
与void
完全相似,则无效。没有东西你就不能打电话给toString
。但是,Unit
的行为略有不同,完全适用于此类情况,a
将获得Unit
的实例。这个实例实际上不会做太多,但它可以调用toString
。因此第二个命令的结果将是一个函数,它返回toString
实例上调用的Unit
的结果,即:
“()”