【问题标题】:How to call this Scala function when "error: Unit does not take parameters"当“错误:单元不带参数”时如何调用这个Scala函数
【发布时间】: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")调用?

如何理解和解决问题?谢谢。

【问题讨论】:

  • 请注意控制台如何为第二种情况返回&lt;function1&gt;b: Unit = ()。你做了val b = print(yourFunction1),因为print返回一个Unit(在打印提供的东西之后),它打印&lt;function1&gt;(这是一个函数1的toString),然后Unit被分配给你的b
  • val b = (s:String) =&gt; print(s + "sd")
  • 现在的问题是为什么_ 不被识别为输入。有什么规则可以识别什么时候不识别?
  • 我想我现在知道原因了。原因是“匿名函数的占位符语法用函数替换了最小的可能包含表达式。”在我的b的定义中,(_: String) + "sd"&lt;function1&gt;。所以b 不是一个函数,它只打印function1 并按照@SarveshKumarSingh 的说法返回Unit。类似:stackoverflow.com/questions/7627117/…
  • 这能回答你的问题吗? What are all the uses of an underscore in Scala?

标签: scala function


【解决方案1】:

确实,正如你已经发现的那样

print((_: String) + "sd")

扩展到

print((x: String) => x + "sd")

而不是想要的

(x: String) => print(x + "sd")

因为_ 绑定到innermost expression delimiter (){}

【讨论】:

  • 这是我总是建议新手避免使用_ 语法的原因之一。它是如何扩展的并不总是很清楚,它可能会引入一些细微的错误,最后简单的 lambda 总是因为命名参数而更具可读性。
【解决方案2】:

考虑以下顺序。

StringString 的匿名函数。

scala> (_: String) + "sd"
res0: String => String = $$Lambda$1156/0x00000008406c1040@6b8bdcc6

打印匿名函数的String 表示。

scala> println((_: String) + "sd")
$line10.$read$$iw$$iw$$$Lambda$1158/0x00000008406c3040@31f5b923

打印匿名函数的String 表示。将结果保存到变量b

scala> val b = println((_: String) + "sd")
$line11.$read$$iw$$iw$$$Lambda$1159/0x00000008406a7040@173cfb01
b: Unit = ()

print()println() 传递的参数是按引用调用,而不是按名称调用,因此在传递给 print() 之前,它会在调用站点进行全面评估。在这种情况下,print() 接收一个函数,它不会成为更大函数的一部分。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-20
    • 1970-01-01
    相关资源
    最近更新 更多