Scala中的参数省略/推断

Jay*_*lor 3 syntax programming-languages scala

所以在另一个问题的评论中,我刚看到这个例子用于计算字符串中L'的数量:

"hello".count('l'==)
Run Code Online (Sandbox Code Playgroud)

而且很疯狂..这很有效.

从完全扩展的版本开始,我们有:

"hello".count(ch => ch == 'l')
Run Code Online (Sandbox Code Playgroud)

然后可以减少到:

"hello".count(_ == 'l')
Run Code Online (Sandbox Code Playgroud)

但是我们可以这样做:

"hello".count('l'==)
Run Code Online (Sandbox Code Playgroud)

我想要...... ??? ...

据推测,Scala推断我们必须在比较结束时添加一个_.IMO,这是事情变得非常奇怪的地方; 这对我来说似乎太过分了.任何人都可以解释允许这种语法背后的想法,或进一步阐明这一点吗?

如果您认为这很酷,那么我们如何证明不假设人们也可能想要==运算符,那么可以省略?然后我们可以:

"hello".count('l')
Run Code Online (Sandbox Code Playgroud)

我想我正在回忆到在perl中有10 ^ 99999种可能的做事方式的噩梦......

mer*_*ict 12

你开始使用的"完全扩展"版本实际上是向后的,它应该是:

"hello".count(ch => 'l' == ch)
Run Code Online (Sandbox Code Playgroud)

但是,==Scala语言并不特别,它只是另一种方法Any.所以进一步扩展:

"hello".count(ch => 'l'.==(ch))
Run Code Online (Sandbox Code Playgroud)

但是请坚持...... count方法TraversableOnce是期望一个带有签名(A) ? Boolean作为参数的函数.签名Any.==()碰巧是Any ? Boolean,所以适合整齐而不需要包装在另一个匿名函数中.所以我们只能说:

"hello".count('l'.==)
Run Code Online (Sandbox Code Playgroud)

或者,省略点:

"hello" count('l' ==)
Run Code Online (Sandbox Code Playgroud)

为什么我们也不省略==运算符?好吧,我猜你可以定义countEqualcount(a => a ==)(或者更简洁一点count(_ ==)),如果你真的想...但你也可以定义countLowerCase或者其他什么.这里的要点==是并不特别.