Scala 3 — 书籍

上下文抽象

语言

在某些情况下,你可以省略一些被认为是重复的方法调用的参数。

这些参数被称为上下文参数,因为它们是由编译器从方法调用周围的上下文中推断出来的。

例如,考虑一个按两个条件对地址列表进行排序的程序:城市名称,然后是街道名称。

val addresses: List[Address] = ...

addresses.sortBy(address => (address.city, address.street))

sortBy 方法采用一个函数,该函数为每个地址返回一个值,以便将其与其他地址进行比较。在这种情况下,我们传递一个函数,该函数返回包含城市名称和街道名称的元组。

请注意,我们只指定比较什么,但没有指定如何执行比较。排序算法如何知道如何比较 String 元组?

实际上,sortBy 方法采用第二个参数——一个上下文参数——由编译器推断。它没有出现在上面的示例中,因为它是由编译器提供的。

第二个参数实现了如何比较。省略它很方便,因为我们知道 String 通常使用字典顺序进行比较。

但是,也可以显式传递它

addresses.sortBy(address => (address.city, address.street))(Ordering.Tuple2(Ordering.String, Ordering.String))
addresses.sortBy(address => (address.city, address.street))(using Ordering.Tuple2(Ordering.String, Ordering.String))

在 Scala 3 中,在 sortBy 的参数列表中 using 表示显式传递上下文参数,避免歧义。

在这种情况下,Ordering.Tuple2(Ordering.String, Ordering.String) 实例正是编译器推断出的实例。换句话说,这两个示例都生成相同的程序。

上下文抽象 用于避免重复代码。它们帮助开发人员编写可扩展且简洁的代码片段。

有关更多详细信息,请参阅本书的 上下文抽象章节,以及 参考文档

此页面的贡献者