복붙노트

[SCALA] 어떻게 스칼라 방법 정적을해야합니까?

SCALA

어떻게 스칼라 방법 정적을해야합니까?

나는 클래스가

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

}

object MyClass {

}

나는 하나 개의 작업 ( "문자열 조작을하지"라는 영역)을 수행하는 코드 블록을 가지고 있기 때문에, 나는 그것을 자신의 방법으로 그것을 파괴해야한다고 생각. 이 방법은 클래스의 상태를 변경하지 않기 때문에, 나는 그것을 정적 방법해야한다 생각했다.

어떻게 그렇게 할 수 있습니까?

난 그냥 동반자 개체 내부의 방법을 팝업 할 수 있으며이 같은 정적 클래스로 사용할 수있을 것이라고 생각했다 :

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

내가 발 rdd2 = myRDD.map하려고 할 때 (mystring에 => {doStringManipulation (mystring에)}), 스칼라는 방법을 인식하지 않고 그것을 호출하기 위해 MyClass.doStringManipulation (mystring에)을 할 저를 강제로.

내가 무엇을 잘못하고 있지?

해결법

  1. ==============================

    1.당신이 당신의 질문에 정의 된 바와 같이, 클래스 또는 싱글 톤의 인스턴스이라고해도, 모든 메소드가 객체에 대해 정의됩니다 스칼라에서 정적 방법이 없습니다.

    당신이 당신의 질문에 정의 된 바와 같이, 클래스 또는 싱글 톤의 인스턴스이라고해도, 모든 메소드가 객체에 대해 정의됩니다 스칼라에서 정적 방법이 없습니다.

    올바르게 지적한 바와 같이, 클래스와 같은 컴파일 단위에서 같은 방법으로라는 개체를함으로써 당신은 객체 두 사람이 서로 개인 필드와 메소드에 액세스 할 수 있다는 것을 의미 클래스의 동반자 만들지 만,이 액세스중인 오브젝트하는 지정하지 않고 그들이 사용할 수 있도록 않습니다.

    당신이, 당신은 단지 '클래스의 범위를 메서드를 가져올 수 있습니다 의미가 생각한다면, 언급 (MyClass.doStringManipulation (mystring에)) 또는 당신이 중 하나를 긴 형식을 사용하고 싶은로서 다음과 같습니다 :

    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
    }
    
  2. ==============================

    2.당신은 스칼라의 조언을 따라야합니다.

    당신은 스칼라의 조언을 따라야합니다.

    브로 rdd2 = myRDD.map (MyClass.doStringManipulation)

  3. from https://stackoverflow.com/questions/48178192/how-do-i-make-my-scala-method-static by cc-by-sa and MIT license