Scala 隐式类

Sha*_*kar 0 scala

根据文档https://users.scala-lang.org/t/sip-13-implicit-classes-scala-documentation/705,隐式类的用例是
“提出了一种新的语言构造来简化类的创建为另一种类型提供扩展方法。”
这需要创建新类、各自的函数并导入。
通过创建具有静态方法的 Utils 类可以实现相同的效果。我无法理解隐式类在这里添加了哪些额外的好处,而这些好处是通过具有静态方法的 Utils 类无法实现的。

Rya*_*ull 6

你本身并没有获得任何“力量”,即做你以前做不到的事情的能力;然而,隐式类提供了一些 Utils 类中没有的静态方法,清晰。

假设您想做某事,例如检查字符串是否至少包含几种不同选择之一。您可以像这样实现此功能:

object Hello {

    def main(args: Array[String]): Unit = {

        val str =
            """
              |Hello Mary,
              |
              |How's it going? I hope everything is going well with you.
              |
              |Bye!
            """.stripMargin

        println( StrUtils.containsOneOf(str,"Good","well","once","later"))
    }

}

object StrUtils {

    def containsOneOf(stringToCheck: String,strings: String*): Boolean = {
        strings.exists(stringToCheck.contains(_))
    }
}
Run Code Online (Sandbox Code Playgroud)

这是可行的,但它看起来也有点笨重。如果我们使用隐式类,我们可以让它看起来像这个功能一直是 String 类的一部分。

object Hello {

    def main(args: Array[String]): Unit = {

        val str =
            """
              |Hello Mary,
              |
              |How's it going? I hope everything is going well with you.
              |
              |Bye!
            """.stripMargin

        println( str.containsOneOf("Good","well","once","later"))
    }

    implicit class StringUtils(s: String) {
        def containsOneOf(strings: String*): Boolean = {
            strings.exists(s.contains(_))
        }
    }

}
Run Code Online (Sandbox Code Playgroud)

我相信第二个示例更加清晰,一旦您开始构建复杂的表达式,这种语法确实会有所帮助。

边注

由于(几乎)所有编程语言都是图灵完备的,这意味着它们可以用来计算图灵机可以计算的任何东西,因此它们在某种意义上“同样强大”。那么,鉴于我们的语言同样强大,我们应该如何判断一种编程语言呢?实际上,我认为衡量编程语言好坏的主要指标之一是它在复杂性增加时保持易读性的能力。不具有可组合的明确正交特征基础的语言往往会产生较大的定义(即大量边缘情况),并且最终会变得更加混乱。

此功能(隐式类)的主要好处是帮助我们保持代码的易读性。