Scala3 given语法中as与with关键字作用及对应Scala2写法咨询
你给出的是Scala 3中命名given实例的标准语法,两个关键字的作用解释如下:
as关键字的作用
你的猜测基本正确,as是用来显式声明given实例的公开暴露类型,同时连接实例名称和类型,具体作用有两个:
- 当你需要给given实例指定自定义名称(这里是
listOrdering[A])时,必须用as连接名称和对应的实例类型,方便后续显式导入、引用该given实例 - 可以避免编译器自动推导的实例类型过于具体(比如自动推导成匿名实现类的类型),确保暴露的类型和implicit查找时需要的类型匹配,减少查找失败的概率
如果不需要给given实例命名,可以省略名称和as,直接写given Ordering[List[A]] with ...即可。
补充:你看到的as是软修饰符的说明,指的是as仅在given、扩展方法等特定语法场景下会被当做关键字处理,普通代码中你仍然可以用as作为变量/方法名,不会产生冲突。
with关键字的作用
这里的with和Scala 2中的多继承with本质完全一致,没有区别。
你给出的写法是当场实现trait/抽象类的匿名实例语法:with前面的Ordering[List[A]]是你要实现的特质,后面的缩进块是你对特质中抽象方法compare的实现,等价于创建一个继承了Ordering[List[A]]的匿名类的实例。
如果你的given实例可以直接赋值(不需要当场实现方法),可以省略with和实现块,直接写given as Ordering[List[A]] = 已有的实例即可。
对应的Scala 2写法
这段Scala 3代码完全等价于如下Scala 2的implicit定义:
implicit def listOrdering[A](implicit ord: Ordering[A]): Ordering[List[A]] = new Ordering[List[A]] { def compare(a: List[A], b: List[A]) = ??? }
对比可以看出:
- Scala 3的
given对应Scala 2的implicit修饰符 - Scala 3的
using参数列表对应Scala 2的隐式参数列表 as后的类型对应Scala 2中隐式方法的返回值类型with加实现块对应Scala 2中new Xxx {}的匿名类实现逻辑
相关语法的完整说明可以查阅Scala 3官方参考手册的Given Instances章节。
内容的提问来源于stack exchange,提问作者greenTea
相关产品推荐
相关产品推荐

