Scala 有人能解释一下这是怎么回事吗?
代码如下:Scala 有人能解释一下这是怎么回事吗?,scala,unit-type,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> scala>def-foo(bar:Unit=>String)={bar} foo:(条:(单位)=>字符串)(单位)=>
scala> def foo(bar: Unit => String) = {bar}
foo: (bar: (Unit) => String)(Unit) => String
scala> foo(a => a.toString)
res0: (Unit) => String = <function1>
scala>def-foo(bar:Unit=>String)={bar}
foo:(条:(单位)=>字符串)(单位)=>字符串
scala>foo(a=>a.toString)
res0:(单位)=>字符串=
我猜a的类型是Unit,但Unit不是对象吗?Unit类是隐藏的吗?在Scala
中,Unit
相当于Java的void
。您定义了一个函数,该函数接受另一个不带参数的函数,并返回一个字符串
这相当于def foo(bar:=>String)代码>或def foo(条:()=>字符串)
在Scala中,()
是从您的示例工作的单元的快捷方式
def foo(bar: Unit => String) = {bar}
这定义了foo
方法,该方法接受从Unit
到String
的函数作为其唯一参数,并简单地返回相同的参数
foo(a => a.toString)
a=>a.toString
内联定义函数。因为类型推断器知道函数Unit=>String
应该在这个位置,所以它推断a
属于Unit
类型
调用foo
然后返回刚才定义的匿名函数
我很好奇,你到底想在这里实现什么?或者你只是在探索Scala的语法?凯文·赖特给出的答案完全正确,但要进一步细分:
第一行是声明一个名为foo
的函数foo
将另一个函数bar
作为其参数,该函数本身接受Unit
并返回字符串。一般来说,scala中的Unit
与许多其他语言中的void
具有相同的含义,因此您可以在很大程度上说bar
是一个不接受参数并返回字符串的函数
foo
函数体只返回它接收到的参数。因此,scala推断foo
返回一个函数,该函数采用单位
,并返回一个字符串
第二个命令调用foo
,函数a=>a.toString
作为其参数a
被假定为单元类型
。如果Unit
与void
完全相似,这就行不通了。你不能在没有东西的情况下调用toString
。但是,Unit
的行为稍有不同,正是在这种情况下,a
将给出Unit
的一个实例。这个实例实际上不能做很多事情,但是它可以调用toString
。因此,第二个命令的结果将是一个函数,该函数返回在单元
实例上调用的toString
的结果,即:
“()”单元
是一个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 = ()
scala>def-foo(bar:Unit=>String)={bar}
foo:(bar:Unit=>String)Unit=>String
scala>foo(a=>a.toString)
res0:Unit=>String=
scala>res0(())
res1:String=()
我的主要困惑源于我正在将.toString应用于Unit的一个实例。一个单元对象可以用任何其他方式实例化吗?(新单元)。toString和Unit()。toString都失败。获取Unit实例的唯一方法是“()”。例如,行“().toString”将为您提供单元实例的toString。@Henry,您传入res0
的任何内容都将是()
类型。你想干什么?因为给定你所拥有的总是返回String=()
@Amir,我只是在玩弄函数定义,我觉得你可以实例化Unit类很奇怪。在我的浏览器中,我的答案出现在你的下面。根据个人经验,如果引用其他回复,引用海报的名字是最安全的。