什么是Scala中的“上下文绑定”?

什么是Scala中的“上下文绑定”?

Scala2.8的一个新特性是上下文边界。什么是上下文约束,它在哪里有用?

当然,我首先搜索了(例如发现)这,这个但我找不到任何真正清晰和详细的信息。


波斯汪
浏览 428回答 3
3回答

万千封印

你有没有发现这篇文章?它涵盖了数组改进上下文中的新上下文绑定特性。类的类型参数。上下文约束是形式上的[T: Bound],它被扩展为普通类型参数。T与类型的隐式参数一起使用。Bound[T].考虑一下方法tabulate它由对从0到给定长度的数字范围内应用给定函数f的结果形成数组。到Scala2.7,表格可以写成如下:def&nbsp;tabulate[T](len:&nbsp;Int,&nbsp;f:&nbsp;Int&nbsp;=>&nbsp;T)&nbsp;=&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;val&nbsp;xs&nbsp;=&nbsp;new&nbsp;Array[T](len) &nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(i&nbsp;<-&nbsp;0&nbsp;until&nbsp;len)&nbsp;xs(i)&nbsp;=&nbsp;f(i) &nbsp;&nbsp;&nbsp;&nbsp;xs}在Scala2.8中,这已经不可能了,因为创建正确的表示形式需要运行时信息。Array[T]..需要通过传递ClassManifest[T]作为隐式参数进入该方法:def&nbsp;tabulate[T](len:&nbsp;Int,&nbsp;f:&nbsp;Int&nbsp;=>&nbsp;T)(implicit&nbsp;m:&nbsp;ClassManifest[T])&nbsp;=&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;val&nbsp;xs&nbsp;=&nbsp;new&nbsp;Array[T](len) &nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(i&nbsp;<-&nbsp;0&nbsp;until&nbsp;len)&nbsp;xs(i)&nbsp;=&nbsp;f(i) &nbsp;&nbsp;&nbsp;&nbsp;xs}作为速记形式,上下文约束可用于类型参数。T相反,给予:def&nbsp;tabulate[T:&nbsp;ClassManifest](len:&nbsp;Int,&nbsp;f:&nbsp;Int&nbsp;=>&nbsp;T)&nbsp;=&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;val&nbsp;xs&nbsp;=&nbsp;new&nbsp;Array[T](len) &nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(i&nbsp;<-&nbsp;0&nbsp;until&nbsp;len)&nbsp;xs(i)&nbsp;=&nbsp;f(i) &nbsp;&nbsp;&nbsp;&nbsp;xs}

慕桂英4014372

Robert的回答涵盖了上下文界限的Techinal细节。我来解释一下他们的意思。在Scala中,视图绑定(A <% B)抓住了“可以视为”的概念(而上界则是<:捕捉“is a”的概念)。上下文约束(A : C)说“有一种类型”。您可以将有关清单的示例阅读为“T有一个Manifest“.您链接到的关于OrderedVSOrdering说明了不同之处。一种方法def&nbsp;example[T&nbsp;<%&nbsp;Ordered[T]](param:&nbsp;T)表示该参数可视为Ordered..相比较def&nbsp;example[T&nbsp;:&nbsp;Ordering](param:&nbsp;T),该参数具有关联的Ordering.就使用而言,需要一段时间才能建立约定,但上下文界限比视图边界更可取(视图边界现在不再受欢迎。)。一种建议是,当您需要将隐式定义从一个作用域转移到另一个作用域时,上下文绑定是首选的,而不需要直接引用它(对于ClassManifest用于创建数组)。另一种考虑视图边界和上下文边界的方法是,第一种方法是从调用方的作用域传递隐式转换。第二个从调用者的作用域传输隐式对象。

慕哥6287543

上下文边界实际上是视图边界的概括。因此,给定这个用视图绑定表示的代码:scala>&nbsp;implicit&nbsp;def&nbsp;int2str(i:&nbsp;Int):&nbsp;String&nbsp;=&nbsp;i.toString int2str:&nbsp;(i:&nbsp;Int)Stringscala>&nbsp;def&nbsp;f1[T&nbsp;<%&nbsp;String](t:&nbsp;T)&nbsp;=&nbsp;0f1:&nbsp;[T](t:&nbsp;T)(implicit&nbsp;evidence$1:&nbsp;(T)&nbsp;=>&nbsp;String)Int这也可以通过上下文绑定来表示,可以借助类型别名来表示类型中的函数。F键入T.scala>&nbsp;trait&nbsp;To[T]&nbsp;{&nbsp;type&nbsp;From[F]&nbsp;=&nbsp;F&nbsp;=>&nbsp;T&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;defined&nbsp;trait&nbsp;Toscala>&nbsp;def&nbsp;f2[T&nbsp;:&nbsp;To[String]#From](t:&nbsp;T)&nbsp;=&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;f2:&nbsp;[T](t:&nbsp;T)(implicit&nbsp;evidence$1:&nbsp;(T)&nbsp;=>&nbsp;java.lang.String)Intscala>&nbsp;f2(1)res1:&nbsp;Int&nbsp;=&nbsp;0上下文绑定必须与类的类型构造函数一起使用。* => *..但是,类型构造函数Function1是一种(*, *) => *..类型别名的使用部分地将第二个类型参数与类型一起应用。String,生成正确类型的类型构造函数,用作上下文绑定。有一项建议允许您在Scala中直接表示部分应用的类型,而无需在特征中使用类型别名。然后你可以写:def&nbsp;f3[T&nbsp;:&nbsp;[X](X&nbsp;=>&nbsp;String)](t:&nbsp;T)&nbsp;=&nbsp;0
打开App,查看更多内容
随时随地看视频慕课网APP