如何避免无参数案例类?

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

我有以下我要改进的代码段:

final case class GenderOps[F[_]]()
                                (implicit xa: Transactor[F],
                                 ev: Bracket[F, Throwable]) extends GenderDb[F] {
  override def create: F[Int] =
    sql"""
    CREATE TABLE interests
    (
      id smallserial NOT NULL,
      interest character varying(40) NOT NULL,
      PRIMARY KEY (id)
    )
    """.update.run.transact(xa)

  override def seed[L[_] : Foldable](v: L[Gender]): F[Int] = ???

您可以在代码上看到,case class具有空参数。是否可以避免case class

scala scala-cats
2个回答
4
投票
案例类只能用于数据建模,不能用于处理。

这将是更好的模制方法:

sealed trait GenderDb[F[_]] { def create: F[Int] def seed[L[_] : Foldable](v: L[Gender]): F[Int] } object GenderDb { def apply[F[_]](implicit xa: Transactor[F], ev: Bracket[F, Throwable]): GenderDb[F] = new GenderDb[F] { override def create: F[Int] = sql""" CREATE TABLE interests ( id smallserial NOT NULL, interest character varying(40) NOT NULL, PRIMARY KEY (id) ) """.update.run.transact(xa) override def seed[L[_] : Foldable](v: L[Gender]): F[Int] = ??? } }


3
投票
不带参数列表的案例类已在Scala 2.10中弃用,并在2.11中被定为非法。原因之一是它们可能导致confusion,例如

case class Foo Foo // does this refer to companion object or to construction via Foo.apply()?

没有参数列表或空参数列表的案例类应该改为case object

case object Foo // instead of case class Foo()

但是对象不使用类型参数

case object Foo[T] // syntax error

考虑到名称Ops中的GenderOps后缀,看来您的意图是使用一些方法来丰富某些类,这些方法指示案例类或案例对象可能不是正确的工具。如果您想通过扩展方法来丰富,请考虑使用trait或隐式类。
© www.soinside.com 2019 - 2024. All rights reserved.