Scala3中new Ord[T]: 冒号形式匿名实例是否等价于传统匿名类?
关于Scala 3中
new Ord[T]: ...语法的说明 这个写法和传统大括号包裹的匿名类作用完全等价,没有任何语义或运行时行为的差异,只是Scala 3缩进语法(可选大括号语法)的常规应用。
Scala 3从设计上支持用「冒号+严格缩进的代码块」替代传统的大括号来标记代码边界,这套规则对所有需要代码块的语法结构生效,并不是匿名类独有的特殊语法:
- trait、类、单例对象的定义
- 方法、函数的实现体
- if/for/while/match等控制结构的分支块
- 匿名实现类、扩展方法的逻辑块
- 上下文抽象相关的各种定义块
你贴的示例代码本身就全程使用了这套语法:开头的trait Ord[T]:、两个基于extension的比较方法定义、descending方法的实现体,都是用冒号引出缩进块替代大括号的写法。
你有疑问的匿名类部分,如果改写成传统大括号风格,代码如下,和示例代码的编译结果、运行逻辑100%一致:
def descending[T](using asc: Ord[T]): Ord[T] = new Ord[T] { def compare(x: T, y: T) = asc.compare(y, x) }
Scala 3允许开发者自由选择使用缩进风格或者大括号风格,也支持两种风格在同一份代码里混用,编译器不会对两种写法做差异化处理,纯粹是代码风格偏好的选择。
内容的提问来源于stack exchange,提问作者melston
相关产品推荐
相关产品推荐

