【发布时间】:2020-01-15 18:00:27
【问题描述】:
当我定义这个函数时,我可以毫无问题地调用它:
scala> val c = (_: String) + "sd"
c: String => String = <function1>
scala> c("1")
res13: String = 1sd
但是,如果我让上述函数print 得到结果而不返回它,则会出现以下错误:
scala> val b = print((_: String) + "sd")
<function1>b: Unit = ()
scala> b("1")
<console>:26: error: Unit does not take parameters
b("1")
^
我知道系统方法print 返回Unit 类型,但函数b 不应该是可以使用我定义的参数调用的函数吗? 为什么上面的b函数不能用b("1")调用?
如何理解和解决问题?谢谢。
【问题讨论】:
-
请注意控制台如何为第二种情况返回
<function1>b: Unit = ()。你做了val b = print(yourFunction1),因为print返回一个Unit(在打印提供的东西之后),它打印<function1>(这是一个函数1的toString),然后Unit被分配给你的b。 -
val b = (s:String) => print(s + "sd") -
现在的问题是为什么
_不被识别为输入。有什么规则可以识别什么时候不识别? -
我想我现在知道原因了。原因是“匿名函数的占位符语法用函数替换了最小的可能包含表达式。”在我的
b的定义中,(_: String) + "sd"是<function1>。所以b不是一个函数,它只打印function1 并按照@SarveshKumarSingh 的说法返回Unit。类似:stackoverflow.com/questions/7627117/…