web-dev-qa-db-ja.com

scalaメソッドを静的にする方法は?

クラスがあります

_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)を実行するように強制されます。

何が悪いのですか?

11
B. Smith

Scalaメソッドはありませんstaticメソッドはありません:クラスまたはシングルトンのインスタンスであるかどうかにかかわらず、すべてのメソッドは、質問。

正しく指摘したように、classobjectを同じコンパイル単位で同じ方法で名前を付けることにより、オブジェクトをクラスの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
}
10
stefanobaghino

Scalaのアドバイスに従う必要があります。

val rdd2 = myRDD.map(MyClass.doStringManipulation)

2
Joaquín Bucca