クラスがあります
_class MyClass {
def apply(myRDD: RDD[String]) {
val rdd2 = myRDD.map(myString => {
// do String manipulation
}
}
_
}
_object MyClass {
}
_
1つのタスク(_"do String manipulation"
_と書かれている領域)を実行するコードのブロックがあるので、独自のメソッドに分割する必要があると思いました。メソッドはクラスの状態を変更しないので、static
メソッドにする必要があると思いました。
それ、どうやったら出来るの?
コンパニオンオブジェクト内のメソッドをポップするだけで、次のように静的クラスとして使用できると思いました。
_object MyClass {
def doStringManipulation(myString: String) = {
// do String manipulation
}
}
_
しかし、val rdd2 = myRDD.map(myString => { doStringManipulation(myString)})
を試してみると、scalaはメソッドを認識せず、それを呼び出すためにMyClass.doStringManipulation(myString)
を実行するように強制されます。
何が悪いのですか?
Scalaメソッドはありませんstaticメソッドはありません:クラスまたはシングルトンのインスタンスであるかどうかにかかわらず、すべてのメソッドは、質問。
正しく指摘したように、class
とobject
を同じコンパイル単位で同じ方法で名前を付けることにより、オブジェクトをクラスのcompanionにします。つまり、2つは互いに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
メソッドでは、将来消えるa表記を使用しました:
// 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
}
Scalaのアドバイスに従う必要があります。
val rdd2 = myRDD.map(MyClass.doStringManipulation)