gpt4 book ai didi

scala - < :<, <%<, = := work in the compiler? 的 Scala 实现究竟如何

转载 作者:行者123 更新时间:2023-12-04 11:41:47 26 4
gpt4 key购买 nike

我现在看到有一个相关的问题,询问这些运算符 (<:<, <%<, =:=) 在这里做什么:

What do <:<, <%<, and =:= mean in Scala 2.8, and where are they documented?

但我仍然对它们的实现感到困惑。特别是,我假设一旦您放置了一个声明特定关系的隐式参数,那么您就可以使用变量,就好像它们已自动正确转换一样,例如这将编译:

class Foo[T](a: T) {
def splitit(implicit ev: T <:< String) = a split " "
}

但这在编译器中实际上是如何工作的?这些运算符是否有一些神奇的编译器支持,如果没有,允许它从定义中推断出这种关系的底层机制是什么? (这种机制是专门为了允许这些运算符工作而添加的吗,它对这些特定运算符的具体程度如何?)您可以像这样放置一个额外的隐式参数,以某种方式改变编译器对类型的解释,这似乎有点神奇。

最佳答案

实现有点棘手,但没什么神奇的。
Predef中有一个隐式方法它可以提供 A <:< A 类型的值对于任何 A

implicit def conforms[A]: A <:< A

当您尝试调用您的方法时,它会查找类型 T <:< String 的隐式值。 .编译器将检查是否 conforms[T]是一个有效值。比方说 TNothing那么就会有一个隐含的值 Nothing <:< Nothing在允许您的方法调用编译的范围内。由于方式 <:<被定义为
sealed abstract class <:<[-From, +To]
From允许向上变化和 To允许向下变化。所以一个 Nothing <:< Nothing仍然有效 Nothing <:< StringNothingString 的子类型.一个 String <:< String也是有效的 Nothing <:< StringStringNothing 的父类(super class)型(但编译器似乎总是只选择第一种类型)。

您可以调用 String 的方法因为 <:<也扩展 =>又名 Function1并用作 T 的隐式转换至 String ,这基本上最终做了一个安全的 Actor 。
=:=是一样的东西,除了它没有任何变化注释定义,所以类型必须完全匹配。
<%<定义为 <:<但是隐式方法有点不同,它添加了另一个参数来指定 View 边界
implicit def conformsOrViewsAs[A <% B, B]: A <%< B

它也已弃用。

关于scala - < :<, <%<, = := work in the compiler? 的 Scala 实现究竟如何,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11488554/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com