【问题标题】: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)
另外两个视图边界用例:
【解决方案2】:
你所说的隐式转换只不过是全局范围内的视图。
在使用类型参数时,视图边界是必需的,因为它表明需要进行隐式转换。例如:
def max[T](a: T, b: T): T = if (a < b) b else a
因为T 上没有任何约束,编译器不知道< 方法是否可用。让我们看看编译器让你继续这样做,然后考虑这两个调用:
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
这不仅告诉编译器<方法来自哪里,还告诉编译器max(true, false)是无效的。