我正在阅读http://docs.scala-lang.org/tutorials/tour/views.html,但我不明白它们的目的是什么?
请提供一个示例,而不是网站上声明的示例。
答案 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中已被弃用,但它们只是你链接所讨论的一小部分。