Scala 为什么可以';t_uu是否用于指示方法重写中未使用/忽略的参数?

Scala 为什么可以';t_uu是否用于指示方法重写中未使用/忽略的参数?,scala,Scala,考虑: trait Validation { def isValid(str: String): Boolean } class AlwaysValid extends Validation { override def isValid(_: String) = true } 屈服 <console>:1: error: identifier expected but '_' found. override def isValid(_: String) = t

考虑:

trait Validation {
  def isValid(str: String): Boolean
}
class AlwaysValid extends Validation {
  override def isValid(_: String) = true
}
屈服

<console>:1: error: identifier expected but '_' found.
       override def isValid(_: String) = true

此外:
允许在lambdas中使用
,甚至多次:

scala> val x: Int => Int = _ => 3
x: Int => Int = <function1>

scala> val x: (Int, Int) => Int = (_, _) => 3
x: (Int, Int) => Int = <function2>
scala>valx:Int=>Int=>3
x:Int=>Int=
scala>valx:(Int,Int)=>Int=(u,u)=>3
x:(Int,Int)=>Int=

这里有一个更详细的解释:

  • \uu
    与lambdas一起工作的原因是lambdas无论如何都不能有命名参数
  • 如果通过父类类型(
    Foo
    )的引用对子类(
    Baz
    )实例进行多态调用,Scala将简单地将父类方法名(
    arg0
    )“继承”到子类中,这样多态调用就不会在
    Baz#bar
    中看到更改后的名称
    blablablabla
  • 但是,子类方法仍然需要可以直接调用,因此它确实需要为其参数提供有效的名称,因此
    \uuu
    由于明显的原因无法工作;还建议这些方法与父类方法名称相匹配,为了清晰起见,父类方法名称被重写

  • 因为在调用方法时可以使用参数名


    Scala允许您在重写时更改参数的名称(尽管不鼓励这样做),但如果调用者愿意,您始终需要提供一个名称供调用者使用。

    我认为这只是一个语法问题

    是scala中的一个特殊标识符,允许在定义良好的一组情况下使用它,例如lambdas、部分方法应用程序和模式匹配


    我没有研究语言规范,但可以安全地假设方法参数应该是名称标识符,
    \uuu
    不是有效的参数。

    为什么要有一个从未使用过的参数?很好,谢谢;我应该说得更具体些;我已经把问题缩小到方法重写,我看不出这会如何改变问题。重写仍然必须具有相同的方法签名,那么为什么应该允许您忽略参数?@m-z:我关于继承和参数的示例对您来说没有意义吗?另外,我还添加了一个注释w.r.t lambdas和忽略的参数。即使IDE和编译器“做了所有正确的事情”,阅读代码的人仍然会对参数的上下文以及为什么应该忽略它(不查找重写的方法)有点困惑。谢谢,但这并不能回答这个问题-我实际上在我自己的问题上发布了完全相同的答案,但随后将其删除并更新了该问题-这是关于覆盖中的
    。事实上:你的意思是当直接调用方法而不是“多态”时?我鼓励你看看这篇文章:
    scala> val x: Int => Int = _ => 3
    x: Int => Int = <function1>
    
    scala> val x: (Int, Int) => Int = (_, _) => 3
    x: (Int, Int) => Int = <function2>