Scala 中的隐式类

Posted

技术标签:

【中文标题】Scala 中的隐式类【英文标题】:Implicit Classes in Scala 【发布时间】:2016-11-30 01:45:29 【问题描述】:

以下是 Scala 隐式类的示例程序:

object Run 
   implicit class IntTimes(x: Int) 
      def times [A](f: =>A): Unit = 
         def loop(current: Int): Unit =

         if(current > 0)
            f
            loop(current - 1)
         
         loop(x)
      
   

还有一个类叫“4 times println("hello")”如下,但我不明白“4 times println("hello")”是什么意思?

object Demo 
   def main(args: Array[String]) 
      4 times println("hello")
   

【问题讨论】:

***.com/questions/2842540/… 这个可以叫'times(4) println("hello")' 【参考方案1】:

4 times println("hello")大致翻译为:

val c = new IntTimes(4)
c.times(println("hello"))

也就是说,由于有一个隐式类将Int 作为其唯一参数,使用方法times,执行4.times 隐式实例化以4 作为参数的类,然后调用times on它。

【讨论】:

【参考方案2】:

我还发现这个示例过于复杂,无法演示隐式类。

简而言之,隐式类用新的方法和属性覆盖其他类。

在这个例子中,它重写了 Int 来给它一个方法 times。 times 方法采用具有通用返回类型的按名称调用参数:

def times [A](f: =>A): Unit

意味着 f 是一个返回泛型类型 A 的函数。

当使用名称调用变量时,它调用函数并成为返回值。 在 times 方法中,它使用递归来循环调用 f 的整数次数。

在 scala 中,您可以使用点或空格来调用方法,而参数不需要括号, 所以object.method(param1, param2) 可能是object method param1 param2

因此最后一次通话4 times println("hello") 其实是4.times(println("hello"))

【讨论】:

我在这里有点困惑。我看到方法“times”采用不接受任何输入并返回 A 作为输出的功能参数。但是在“times”的调用中,函数 println 被传递,它接受一个字符串作为 i/p 并返回 Unit。这与签名正好相反。但这是有效的。有人可以帮我理解。提前致谢! 看到 f 具有按名称调用的语义很有用,因此对 f 的评估会延迟到实际执行调用 f 的主体中的行。 loop 的函数体的大括号已被跳过,以显示函数体仅包含 if 语句。所以,times 方法只定义了loop 并调用了一次。

以上是关于Scala 中的隐式类的主要内容,如果未能解决你的问题,请参考以下文章

akka 流 SubFlow 的隐式类(通用路径相关类型)

Play/Scala 中的隐式参数和组合视图

scala中隐式转换之隐式类

如何在 Java 中使用 Scala 隐式类

如何在 Java 中使用 Scala 隐式类

scala中隐式转换之总结