我有一个班级
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)
以便调用它。
我做错了什么?
答案 0 :(得分:3)
在Scala中没有静态方法:所有方法都是在对象上定义的,无论是类的实例还是单例,都是您在问题中定义的方法。
正如您正确指出的那样,通过在同一个编译单元中以相同的方式命名class
和object
,您可以使该对象成为该类的伴侣 ,这意味着两者可以访问彼此的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._