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>