Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 有人能解释一下这是怎么回事吗?_Scala_Unit Type - Fatal编程技术网

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类很奇怪。在我的浏览器中,我的答案出现在你的下面。根据个人经验,如果引用其他回复,引用海报的名字是最安全的。