案例类中的静态函数(Scala)

11

我在Scala应用程序中有一个case类,并且有一个静态函数,我希望在该类中编写,因为这是最合理的方式。

case class At (
    date : DateTime,
    id : String,
    location : Coordinate
)
{
...

   def getParsedValues(line : String) : At =
   {
      val mappedFields : Array[String] = Utils.splitFields(line)
      val atObject = new At(mappedFields)
      return atObject;
   }

...
}

然后我想从另一个Scala对象中调用静态方法getParsedValues():

object Reader{
...
    var atObject = At.getParsedValues(line)
...
}

但是它会出现错误 value getParsedEvent is not a member of object At

我该如何使其正常工作?谢谢。

1个回答

21

在Scala中编写与Java静态方法等效的标准方式是将该方法添加到类的伴生对象中。因此:

case class At (
    date : DateTime,
    id : String,
    location : Coordinate
)

object At
{
...

   def getParsedValues(line : String) : At =
   {
      val mappedFields : Array[String] = Utils.splitFields(line)
      val atObject = new At(mappedFields)
      return atObject;
   }

...
}

然后像在 Reader 对象中一样调用它。

另外,你可能需要一个构造函数变体来接受一个 Array[String],最好将其编写为相同伴生对象中的工厂方法。您“静态”方法的中间行将删除 new 关键字。此外,您可以删除对 atObject 的赋值以及 return atObject 行-方法的最后一个表达式的结果会自动作为该方法的返回值。实际上,整个方法只需写成:

def getParsedValues(line: String): At = At(Utils.splitFields(line))

这种方法的问题在于:如果您为案例类声明自定义伴生对象,则编译器不会添加一些实用方法,例如tupled之后就会丢失。请参见此问题https://dev59.com/rF8e5IYBdhLWcg3wwMr7 - amoebe
说得好,@amoebe - 或许可以使用一个名为'AtUtils'或类似的单独对象来解决这个问题。 - Shadowlands

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接