【问题标题】:Static function in case class (Scala)案例类中的静态函数(Scala)
【发布时间】:2015-11-18 08:09:59
【问题描述】:

我在 Scala 应用程序中有一个案例类,以及一个我更喜欢在该类中编写的静态函数,因为它最有意义。 这是课程:

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

我怎样才能让它工作?谢谢

【问题讨论】:

    标签: scala static-methods case-class


    【解决方案1】:

    在 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 关键字。此外,您可以将分配放到atObjectreturn atObject 行 - 方法的最后一个表达式的结果将自动作为该方法的返回值。确实,整个方法可以写成这样:

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

    【讨论】:

    • 这种方法的问题:如果您为案例类声明自定义伴随对象,编译器将不会添加一些实用方法,例如tupled 之后失踪。看到这个问题stackoverflow.com/q/25392422/935676
    • 公平点,@amoebe - 可能有一个单独的对象,'AtUtils' 或类似的东西,可以在有问题的地方使用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多