为什么 scala 中不推荐使用隐式转换?

问题描述 投票:0回答:2

摘自“Scala with cats”(第 18 页):

隐式转换
当您使用隐式 def 创建类型类实例构造函数时,请务必将该方法的参数标记为隐式参数。如果没有这个关键字,编译器将无法在隐式解析期间填充参数。具有非隐式参数的

implicit
方法形成了一种不同的 Scala 模式,称为隐式转换。这也与上一节有关接口语法的不同,因为在这种情况下,
JsonWriter
是一个带有扩展方法的隐式类。隐式转换是一种较旧的编程模式,在现代 Scala 代码中不受欢迎。幸运的是,当您这样做时,编译器会警告您。您必须通过在文件中导入
scala.language.implicitConversions
来手动启用隐式转换

任何人都可以总结一下为什么隐式转换被弃用吗?有哪些限制或问题?为什么带有隐式参数的方法更好?

注意我知道如何很好地使用现代方法,包括隐式链接和所有。我只是好奇问题是什么以及为什么它被弃用。

scala implicit-conversion implicit
2个回答
2
投票

Scala 的发明者 Martin Odersky 表示,隐式(和隐式转换)在 scala 3.1 中已被弃用,最终将从语言中完全删除。

隐式功能将被扩展方法和给定所取代。扩展方法和给定提供了更严格的功能解决方案,不会引入隐式引起的毫无戒心和隐藏的副作用。 Odersky 现在将隐式视为“灾难的秘诀”并且“过于隐式”,这就是他在 3.x 中替换其功能的动机。

https://www.slideshare.net/Lightbend/scala-3-is-coming-martin-odersky-shares-what-to-know

https://hub.packtpub.com/is-scala-3-0-a-new-language-all-together-martin-odersky-its-designer-says-yes-and-no/


0
投票

从 Scala 3.3 开始,隐式转换并未被弃用。

...在 Scala 2 中,隐式转换还用于为封闭类提供附加成员(请参阅隐式类)。在 Scala 3 中,我们建议通过定义扩展方法而不是隐式转换来解决此用例(尽管由于历史原因标准库仍然依赖于隐式转换)。

用于扩展封闭类的隐式转换已被扩展方法所取代,但隐式转换仍然存在并有其用途。

避免隐式转换有几个原因:

  • 将一种类型的值隐式转换为另一种类型的代码可能很难阅读。通常最好是明确并手动转换它。
  • 如果 API 期望您使用隐式转换,那么当隐式转换不在范围内时,可能很难理解错误消息。

因为如果不加区别地使用隐式转换可能会出现陷阱,因此编译器会在两种情况下发出警告:

  • 编译 Scala 2 风格的隐式转换定义时。
  • 在调用站点,给定的
    scala.Conversion
    实例作为转换插入。

要关闭警告,请执行以下任一操作:

  • scala.language.implicitConversions
    导入到以下范围:
    • Scala 2 风格的隐式转换定义
    • 调用插入给定
      scala.Conversion
      实例作为转换的站点。
  • 使用
    -language:implicitConversions
  • 调用编译器
© www.soinside.com 2019 - 2024. All rights reserved.