如何让我的scala方法保持静态?

时间:2018-01-09 23:32:48

标签: scala static static-methods

我有一个班级

class MyClass {
  def apply(myRDD: RDD[String]) {
      val rdd2 = myRDD.map(myString => {
          // do String manipulation
      }
  }

}

object MyClass {

}

由于我有一段代码执行一项任务("do String manipulation"区域),我认为我应该将其分解为自己的方法。由于该方法不会改变类的状态,我认为我应该使它成为static方法。

我该怎么做?

我认为您可以在随播对象中弹出一个方法,它可以作为静态类使用,如下所示:

object MyClass {
  def doStringManipulation(myString: String) = {
    // do String manipulation
  }
}

但是当我尝试val rdd2 = myRDD.map(myString => { doStringManipulation(myString)})时,scala不会识别该方法,并强制我执行MyClass.doStringManipulation(myString)以便调用它。

我做错了什么?

3 个答案:

答案 0 :(得分:3)

在Scala中没有静态方法:所有方法都是在对象上定义的,无论是类的实例还是单例,都是您在问题中定义的方法。

正如您正确指出的那样,通过在同一个编译单元中以相同的方式命名classobject,您可以使该对象成为该类的伴侣 ,这意味着两者可以访问彼此的private字段和方法,但这确实可以在不指定您正在访问的对象的情况下使用它们。

您要做的是使用上面提到的长格式(MyClass.doStringManipulation(myString)),或者,如果您认为有意义,可以在class'中导入该方法。范围,如下:

import MyClass.doStringManipulation

class MyClass {
  def apply(myRDD: RDD[String]): Unit = {
    val rdd2 = myRDD.map(doStringManipulation)
  }
}

object MyClass {
  private def doStringManipulation(myString: String): String = {
    ???
  }
}

作为旁注,对于MyClass.apply方法,您使用了将来会消失的符号:

// this is a shorthand for a method that returns `Unit` but is going to disappear
def method(parameter: Type) {
  // does things
}

// this means the same, but it's going to stay
// the `=` is enough, even without the explicit return type
// unless, that is, you want to force the method to discard the last value and return `Unit`
def method(parameter: Type): Unit = {
  // does things
}

答案 1 :(得分:1)

你应该遵循scala的建议。

val rdd2 = myRDD.map(MyClass.doStringManipulation)

答案 2 :(得分:0)

将此内容写在类中,然后它将按预期工作。

import MyClass._