在 Scala 中为我们的类创建隐式类是个好主意吗[关闭]

Posted

技术标签:

【中文标题】在 Scala 中为我们的类创建隐式类是个好主意吗[关闭]【英文标题】:Is it a good idea to create Implicit classes for our classes in Scala [closed] 【发布时间】:2021-08-19 11:22:21 【问题描述】:

关于隐式类的问题:

我知道 Scala 支持 Implicit 类以向现有行为添加功能,但我们确实为我们自己的类编写了几个 Implicit 类,我认为这样做不是一个好主意,例如:

case class AmountInPence(value: Long)

implicit class AmountInPenceOps(amountInPence: AmountInPence) 
  def inPounds: BigDecimal = (BigDecimal(amountInPence.value) / 100).setScale(2)
 //few other defs and vals
   ......
  

这是我们所有的代码,这意味着我们也拥有 case 类 AmountInPence。我认为使用隐式类作为向我们自己的类添加行为的一种方式对我来说似乎是错误的方法,但我想知道你对此的看法

我们可以在案例类或伴生对象中添加 def 和 val,但是有没有更好的方法来向案例类添加功能,而不是在上述情况下使用隐式

谢谢

Suresh

【问题讨论】:

遗憾的是,这是基于意见的。但是,我会分享我的;这种设计可能是把 Scala 中的一个常见建议极端化的结果,它说你不应该耦合 case classes (或 ADTs 通常) 具有行为,而它们应该只是数据容器,并且您应该具有对它们进行操作的外部函数(通常使用模式匹配。虽然我总体上同意这个建议,但我一直认为(并说)基本上只是内部数据转发器的简单助手可以定义为普通方法。但同样,意见。 隐式类/扩展方法有时可用于克服差异困难(即使您拥有要添加功能的类)。例如,如果你有class A[+T],你不能在里面定义def m(t: T),你必须定义def m[S >: T](t: S)。您可以改为定义implicit class AOps[T](a: A[T]) def m(t: T) 。在github.com/milessabin/shapeless/blob/main/core/src/main/scala/…中使用了这种方法 【参考方案1】:

鉴于您拥有AmountInPence 类,使用隐式类毫无意义。直接将方法添加到AmountInPence即可。

【讨论】:

以上是关于在 Scala 中为我们的类创建隐式类是个好主意吗[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

JsonRequest<String> 是个好主意吗?

通过 Spring MVC 框架包含其他 JSP 是个好主意吗?

使用 ionic 构建网站的移动 Web 版本是个好主意吗? [关闭]

在 PHP mkdir 中使用模式 0664 是个好主意吗?

在现有 AspNetUser 表中手动创建列是个好主意吗?

软删除是个好主意吗? [复制]