Scala中的观点是什么?

时间:2015-01-07 19:06:57

标签: scala views

我正在阅读http://docs.scala-lang.org/tutorials/tour/views.html,但我不明白它们的目的是什么?

请提供一个示例,而不是网站上声明的示例。

2 个答案:

答案 0 :(得分:0)

deprecated截至Scala 2.11(已弃用)

根据此other tutorial,视图绑定是一个包含隐式转换的隐式参数。

答案 1 :(得分:0)

该教程将某种隐含定义为“视图”,但该术语并未真正在社区中流行(部分原因是“视图”已经意味着其他事物);大多数人(IME)会将该链接中描述的内容称为“隐式转换”。

最好的用例是“pimp my library pattern”,相当于例如其他语言中的“扩展方法”,即将新方法添加到您无法自行更改的第三方类型上。通常你这样做是因为第三方类型“真的”符合某些常见的超级接口,但是库的编写者没有使他们的类“扩展”为适当的类型。或者你只是为了节省一些打字。例如。我最近做了类似下面的事情(类型/方法名称不正确,但应该给你一个想法),因为AWS API有一个回调接口,但不是scala future接口

class PimpedAwsTransfer(inner: AwsTransfer) {
  def responseFuture = Future.fromCallback {
    cb => 
      inner.onSuccess(new AwsCallback({
        def callback(response: TransferResponse) = cb(transferResponse)
      }))
  }
}
implicit def pimpAwsTransfer(transfer: AwsTransfer) = new PimpedAwsTransfer(transfer)

现在someTransfer.responseFuture是对AwsTransfer进行的有效方法调用,并将调用我在PimpedAwsTransfer中定义的方法。所以我可以编写如下代码:

for {
  response1 <- transfer1.responseFuture
  response2 <- transfer2.responseFuture
} yield {...}

(请注意,在现代scala中,您会使用implicit class而不是class + implicit def,但这只是同样的事情。

我本可以在某个地方使用静态convertAwsTransferToFuture()函数,但是通过将该方法放在AwsTransfer对象上,我使API更像我想要使用的API。它主要是关于适应第三方类型。

有些人还将这些隐式转换用作转换,即使第三方类型符合其自己的界面。 IMO这是一个不太好的用途,因为它可能导致非常混乱的代码;这种用法通常可以用类型类模式替换,使用隐式方法参数而不是隐式转换。

@Gangstead是正确的, view bounds 在2.11中已被弃用,但它们只是你链接所讨论的一小部分。

相关问题