gpt4 book ai didi

scala - 如何以面向 future 的方式使用 Scala "pimp my library"?

转载 作者:行者123 更新时间:2023-12-04 02:14:16 24 4
gpt4 key购买 nike

我使用 Scala 隐式类来扩展我经常使用的对象。例如,我在 Spark DataFrame 上定义了一个与此类似的方法。 :

implicit class DataFrameExtensions(df: DataFrame) {
def deduplicate: Boolean =
df.groupBy(df.columns.map(col): _*).count
}

但是如果类已经定义了相同的方法,则不会调用隐式 defs。如果我稍后升级到定义了 DataFrame#deduplicate 的新版 Spark 会发生什么情况方法?客户端代码将悄悄地切换到新的实现,这可能会导致细微的错误(或明显的错误,问题较少)。

使用反射,如果 DataFrame 我可以抛出运行时错误已定义 deduplicate在我隐式定义它之前。从理论上讲,如果我的隐式方法与现有方法冲突,我可以检测到它并重命名我的隐式版本。但是,一旦我升级 Spark、运行应用程序并检测到问题,使用 IDE 重命名旧方法为时已晚,因为对 df.deduplicate 的任何引用都为时已晚。现在引用原生 Spark 版本。我将不得不恢复我的 Spark 版本,通过 IDE 重命名该方法,然后再次升级。不是世界末日,但不是一个很好的工作流程。

有没有更好的方法来处理这种情况?如何安全地使用“pimp my library”模式?

最佳答案

您可以添加 test that ensures that certain code snippets do not compile进入DataFrameExtension的测试套件.也许是这样的:

"(???: DataFrame).deduplicate" shouldNot compile

如果它在没有隐式转换的情况下编译,则意味着该方法 deduplicate已由 Spark 库引入。在这种情况下,测试失败,您知道必须更新隐式。

关于scala - 如何以面向 future 的方式使用 Scala "pimp my library"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50331240/

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