【问题标题】:Parameter omission/inference in ScalaScala中的参数遗漏/推断
【发布时间】:2011-10-26 22:45:59
【问题描述】:

所以在another question 的评论中,我刚刚看到了这个计算字符串中 L 数量的示例:

"hello".count('l'==)

够疯狂的......它的工作原理。

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

"hello".count(ch => ch == 'l')

然后可以简化为:

"hello".count(_ == 'l')

但是我们可以这样做:

"hello".count('l'==)

我会想... ??? ...

可能 Scala 是在推断我们一定是想在比较的末尾添加一个 _。 IMO,这就是事情开始变得非常奇怪的地方;这对我来说似乎太过分了。谁能解释允许这种语法背后的想法,或者进一步阐明这一点?

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

"hello".count('l')

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

【问题讨论】:

  • 在 Perl 中有 9 种方法可以完成任何给定任务,但其中 8 种很糟糕。

标签: scala syntax programming-languages


【解决方案1】:

你一开始的“完全扩展”版本其实是倒退的,应该是:

"hello".count(ch => 'l' == ch)

然而,== 在 Scala 语言中并不特殊,它只是Any 的另一种方法。所以进一步扩展:

"hello".count(ch => 'l'.==(ch))

但请稍等...来自TraversableOncecount 方法需要一个带有签名(A) ⇒ Boolean 作为参数的函数。 Any.==() 的签名恰好是 Any ⇒ Boolean,因此它非常适合而不需要包装在另一个匿名函数中。所以我们可以说:

"hello".count('l'.==)

或者,省略点:

"hello" count('l' ==)

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

【讨论】:

    【解决方案2】:

    首先,让我们考虑一下count 的含义:

    "hello".count('l'==)
    

    count,这里是一个接受函数Char => Boolean 的方法,所以这就是它所期望的'l'==。现在,让我们考虑一下:

    'l' ==
    

    这是Char 上的== 方法。那个方法被重载了,但是这个签名看起来很有趣:

    def == (x: Char): Boolean
    

    这意味着您有一个 object.method 其类型为 (x: Char): Boolean 被传递到预期 (x: Char) => Boolean 的地方。真的还有什么要说的吗?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-19
      相关资源
      最近更新 更多