【发布时间】:2021-03-17 09:31:07
【问题描述】:
取自“Scala 与猫”(第 18 页):
隐式转换
使用隐式 def 创建类型类实例构造函数时,请务必将方法的参数标记为隐式参数。如果没有这个关键字,编译器将无法在隐式解析期间填写参数。implicit具有非隐式参数的方法形成了一种不同的 Scala 模式,称为隐式转换。这也与前面的接口语法部分不同,因为在这种情况下,JsonWriter是具有扩展方法的隐式类。隐式转换是一种较旧的编程模式,在现代 Scala 代码中不受欢迎。幸运的是,编译器会在您执行此操作时发出警告。您必须通过在文件中导入scala.language.implicitConversions来手动启用隐式转换
谁能总结一下为什么不推荐使用隐式转换?有什么限制或问题?为什么隐式参数的方法更好?
注意我知道如何很好地使用现代方法,包括链接隐式和所有。我只是好奇这是什么问题以及它被弃用的原因。
【问题讨论】:
-
隐式推导与隐式转换非常不同,前者是一个逻辑证明,当你可以说像我可以推导出
Monoid[List[Map[String, Option[Int]]]]这样的话,因为我可以推导出List的Monoid,因为我可以推导出Map的一个,因为我可以推导出Option的一个,因为我知道Int有一个 - 后者只是一种说我会在每次需要B时将A变成B,但代码会产生A,一般来说,这种模式会导致代码难以阅读(理解),难以维护并且可以隐藏昂贵的操作。 -
不过,确实有“有效用例”。但是,恕我直言,当没有其他更清洁的解决方案时,应该保留这些。有关该主题的深入讨论,请阅读:contributors.scala-lang.org/t/…
标签: scala implicit-conversion implicit