关于Scala中的观点的问题

时间:2011-04-02 21:35:56

标签: scala view implicit-conversion

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

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

2 个答案:

答案 0 :(得分:9)

我对你的问题的理解是,

的优点是什么
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)

是?那么视图的含义正是如此:类型T可以被视为另一种类型S.您的方法或函数可能首先想要处理T.一个例子是Ordered:

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?

答案 1 :(得分:3)

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

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

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)无效。