【问题标题】:Question about views in Scala关于 Scala 中的视图的问题
【发布时间】:2011-04-02 21:35:56
【问题描述】:

我看到了一些示例,其中转换函数T => S 作为隐式参数传递。 Scala calls 这个函数view 甚至提供了特殊的语法糖——view bound——针对这种情况。

但是我们已经有了隐式转换!我可以用隐式转换替换这些views(即作为隐式参数传递的转换函数)吗? ?我可以用views 做什么我不能用隐式转换做什么?

【问题讨论】:

    标签: scala view implicit-conversion


    【解决方案1】:

    我对你的问题的理解是,这样做有什么好处

    case class Num(i: Int)
    implicit def intToNum(i: Int) = Num(i)
    
    def test[A <% Num](a: A): Int = a.i
    test(33)
    

    结束

    def test2(a: Num): Int = a.i
    test2(33)
    

    是吗?那么 view 的意思就是:类型 T 可以被视为另一种类型 S。您的方法或函数可能首先要处理 T。一个例子是有序的:

    def sort[A <% Ordered[A]](x: A, y: A): (A, A) = if (x < y) (x, y) else (y, x)
    
    sort(1, 2)     // --> (1,2)
    sort("B", "A") // --> (A,B)
    

    另外两个视图边界用例:

    • 您可能希望仅在某些情况下从 T 转换为 S,例如懒洋洋 (这在某种程度上与上述情况相同:您基本上想与 T 一起工作)
    • 您可能想要链接隐式转换。看到这个帖子:How can I chain implicits in Scala?

    【讨论】:

      【解决方案2】:

      你所说的隐式转换只不过是全局范围内的视图。

      在使用类型参数时,视图边界是必需的,因为它表明需要进行隐式转换。例如:

      def max[T](a: T, b: T): T = if (a < b) b else a
      

      因为T 上没有任何约束,编译器不知道&lt; 方法是否可用。让我们看看编译器让你继续这样做,然后考虑这两个调用:

      max(1, 2)
      max(true, false)
      

      签名max[T](a: T, b: T): T 中没有任何内容告诉编译器它不应该允许第二次调用,而应该允许第一次调用。这是视图边界的用武之地:

      def max[T <% Ordered[T]](a: T, b: T): T = if (a < b) b else a
      

      这不仅告诉编译器&lt;方法来自哪里,还告诉编译器max(true, false)是无效的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-02-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多