【问题标题】:Why and when do I need to follow a method name with _?为什么以及何时需要在方法名称后面加上 _?
【发布时间】:2010-01-14 13:05:06
【问题描述】:

对于将_ 用作函数的方法之后何时需要_ 的规则,我有点不确定。比如下面的FooNil::为什么会有区别?

def square(n: Int) = n * n  
object Foo { def ::(f: Int => Int) = f(42) }

// ...

scala> Foo.::(square)
res2: Int = 1764

scala> Nil.::(square) 
<console>:6: error: missing arguments for method square in object $iw;
follow this method with `_' if you want to treat it as a partially applied function
   Nil.::(square)
          ^
scala> Nil.::(square _) 
res3: List[(Int) => Int] = List(<function1>)

【问题讨论】:

    标签: scala partial-application


    【解决方案1】:

    当你在一个部分应用的函数表达式中省略所有参数时,你需要在它后面加上_ 除非编译器需要一个函数类型在你用它。

    当您在 Foo 上调用方法 :: 时,编译器期望参数类型为 Int =&gt; Int。因此,您可以放心地省略该位置square 之后的下划线。

    但是,Nil 上的 :: 方法可以采用 any 类型的参数。因此,与其假设您打算部分应用该功能,它会抱怨,除非您通过添加 _ 使其绝对明确。

    所以这些是规则...我无法真正启发您为什么这些是规则;也许对编译器、类型系统和语言设计有更好了解的其他人将能够告诉你原因。但我认为,如果没有这些规则,在许多地方会有意外模棱两可的危险。

    【讨论】:

    • 谢谢。刚刚在 Scala 2.0 的更改说明中找到了 Scala 语言规范的一部分,它为“为什么”提供了一些理由:“方法到函数的隐式转换的规则(第 6.25 节)已经收紧。以前,使用的参数化方法因为值总是被隐式转换为函数。当忘记方法参数时,这可能会导致意外结果。例如下面的语句:show(x.toString)..."
    猜你喜欢
    • 2012-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-15
    • 1970-01-01
    • 1970-01-01
    • 2014-06-01
    相关资源
    最近更新 更多