J'ai un cours
class MyClass {
def apply(myRDD: RDD[String]) {
val rdd2 = myRDD.map(myString => {
// do String manipulation
}
}
}
object MyClass {
}
Puisque j'ai un bloc de code effectuant une tâche (la zone qui dit "do String manipulation"
), J'ai pensé que je devrais le décomposer en sa propre méthode. Puisque la méthode ne change pas l'état de la classe, j'ai pensé que je devrais en faire une méthode static
.
Comment je fais ça?
Je pensais que vous pouvez simplement insérer une méthode dans l'objet compagnon et qu'elle serait disponible en tant que classe statique, comme ceci:
object MyClass {
def doStringManipulation(myString: String) = {
// do String manipulation
}
}
mais quand j'essaie val rdd2 = myRDD.map(myString => { doStringManipulation(myString)})
, scala ne reconnaît pas la méthode et cela m'oblige à faire MyClass.doStringManipulation(myString)
pour l'appeler.
Qu'est-ce que je fais mal?
Dans Scala il n'y a pas de méthodes statiques: toutes les méthodes sont définies sur un objet, que ce soit une instance d'une classe ou un singleton, comme celui que vous avez défini dans votre question.
Comme vous l'avez correctement souligné, en ayant un class
et un object
nommés de la même manière dans la même unité de compilation, vous faites de l'objet un compagnon de la classe, ce qui signifie que les deux ont accès les uns aux autres aux champs et méthodes private
, mais cela les rend disponibles sans spécifier à quel objet vous accédez.
Ce que vous voulez faire, c'est utiliser le formulaire long comme mentionné (MyClass.doStringManipulation(myString)
) ou, si vous pensez que cela a du sens, vous pouvez simplement importer la méthode dans la portée class
', comme suit :
import MyClass.doStringManipulation
class MyClass {
def apply(myRDD: RDD[String]): Unit = {
val rdd2 = myRDD.map(doStringManipulation)
}
}
object MyClass {
private def doStringManipulation(myString: String): String = {
???
}
}
En remarque, pour le MyClass.apply
, vous avez utilisé la notation a qui va disparaître dans le futur:
// 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
}
Vous devez suivre les conseils de scala.
val rdd2 = myRDD.map(MyClass.doStringManipulation)