Scala/IntelliJ: case object X vs case class X vs case class X()
Scala/IntelliJ: case object X vs case class X vs case class X()
Scala 中有 class 个案例:
case class X(one: One, two: two)
有些案例对象只有一个实例(这是有道理的):
case object X
当我声明一个没有参数的 case class 时,IntelliJ 做了正确的事情并弃用 - 警告我将它变成一个 case 对象:
case class X // deprecated stuff
但是它没有警告我
case class X()
这让我想知道 case class X
和 case class X()
之间是否有区别?
我不知道你用的是什么 Scala 版本,但在 2.11 中这不仅被弃用而且确实是一个错误:
Error:(34, 17) case classes without a parameter list are not allowed;
use either case objects or case classes with an explicit `()'
as a parameter list.
case class Foo
^
简单地说,您不能针对无参数列表的情况进行模式匹配class,因此它们没有用处。
case class Foo()
def test(in: Any) = in match {
case Foo() => "foo"
case _ => "other"
}
当您声明一个案例对象时,只会创建一个实例。但是,您可以有多个不同的无参数案例实例 class。为什么你可能想要那是另一回事。
原则上case class Foo
和case class Foo()
没有区别。我认为前者已被弃用,因为它很容易被无意中滥用。这 post 很好地说明了这一点。
Scala 中有 class 个案例:
case class X(one: One, two: two)
有些案例对象只有一个实例(这是有道理的):
case object X
当我声明一个没有参数的 case class 时,IntelliJ 做了正确的事情并弃用 - 警告我将它变成一个 case 对象:
case class X // deprecated stuff
但是它没有警告我
case class X()
这让我想知道 case class X
和 case class X()
之间是否有区别?
我不知道你用的是什么 Scala 版本,但在 2.11 中这不仅被弃用而且确实是一个错误:
Error:(34, 17) case classes without a parameter list are not allowed;
use either case objects or case classes with an explicit `()'
as a parameter list.
case class Foo
^
简单地说,您不能针对无参数列表的情况进行模式匹配class,因此它们没有用处。
case class Foo()
def test(in: Any) = in match {
case Foo() => "foo"
case _ => "other"
}
当您声明一个案例对象时,只会创建一个实例。但是,您可以有多个不同的无参数案例实例 class。为什么你可能想要那是另一回事。
原则上case class Foo
和case class Foo()
没有区别。我认为前者已被弃用,因为它很容易被无意中滥用。这 post 很好地说明了这一点。