복붙노트

[SCALA] 당신은 이름이 문자열에 저장되는 방법을 호출 할 수있는 스칼라 기능이 있습니까?

SCALA

당신은 이름이 문자열에 저장되는 방법을 호출 할 수있는 스칼라 기능이 있습니까?

이 방법의 이름이 포함 된 문자열, 객체 한 가정이 방법을 일부 인수, 당신이 동적으로 호출 할 수 있도록 몇 가지 언어 기능이 있음을 지원?

루비의 전송 파라미터 등의 종류.

해결법

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

    1.당신은 자바에서 반사하여이 작업을 수행 할 수 있습니다 :

    당신은 자바에서 반사하여이 작업을 수행 할 수 있습니다 :

    class A {
      def cat(s1: String, s2: String) = s1 + " " + s2
    }
    val a = new A
    val hi = "Hello"
    val all = "World"
    val method = a.getClass.getMethod("cat",hi.getClass,all.getClass)
    method.invoke(a,hi,all)
    

    그리고 당신이 원하는 경우에 당신은 당신을 위해이 작업을 수행하는 클래스, 플러스 전환에 대한 암시를 할 수 스칼라 쉽게하기 :

    case class Caller[T>:Null<:AnyRef](klass:T) {
      def call(methodName:String,args:AnyRef*):AnyRef = {
        def argtypes = args.map(_.getClass)
        def method = klass.getClass.getMethod(methodName, argtypes: _*)
        method.invoke(klass,args: _*)
      }
    }
    implicit def anyref2callable[T>:Null<:AnyRef](klass:T):Caller[T] = new Caller(klass)
    a call ("cat","Hi","there")
    

    런타임 오류에 일이 변환 이런 종류의 일을 컴파일 타임 오류, 그러나, (즉, 본질적 타입 시스템을 우회)주의와 함께 사용하기 때문에.

    (편집 : 위의 링크에서 NameTransformer의 사용을 참조하십시오 - 당신이 연산자를 사용하려고하면 그 의지 도움말을 추가합니다.)

  2. ==============================

    2.예. 그것은 반사라고. 여기에 한 가지 방법에 대한 링크는 스칼라 동적 언어하지 않고, 쉽게 스크립트 언어가 할 수있는 어떤 일을 할 수 없을 수도 있음을 유의 그러나 일부 실험 재료를 사용합니다. 당신은 아마 더 나은 문자열 된 경기를하고, 다음 오른쪽 메소드를 호출하고 있습니다.

    예. 그것은 반사라고. 여기에 한 가지 방법에 대한 링크는 스칼라 동적 언어하지 않고, 쉽게 스크립트 언어가 할 수있는 어떤 일을 할 수 없을 수도 있음을 유의 그러나 일부 실험 재료를 사용합니다. 당신은 아마 더 나은 문자열 된 경기를하고, 다음 오른쪽 메소드를 호출하고 있습니다.

  3. ==============================

    3.그래 넌 할수있어! 당신은 방법 객체의 .invoke () 메소드가 필요합니다. 간단한 예를 아래 :

    그래 넌 할수있어! 당신은 방법 객체의 .invoke () 메소드가 필요합니다. 간단한 예를 아래 :

     import scala.util.Try
    
     case class MyCaseClass(i: String) {
     def sayHi = {
         println(i)
       }
     }
     val hiObj = MyCaseClass("hi")
     val mtdName = "sayHi"
     // Method itself as an object
     val mtd = hiObj.getClass.getMethod(mtdName)
     Try {mtd.invoke(hiObj)}.recover { case _ => ()}
    

    여기에 코드를 참조하십시오 https://scastie.scala-lang.org/vasily802/WRsRpgSoSayhHBeAvogieg/9

  4. ==============================

    4.

    scala> val commandExecutor = Map("cleanup" -> {()=> println("cleanup successfully")} )
    commandExecutor: scala.collection.immutable.Map[String,() => Unit] = Map(cleanup -> <function0>)
    
    scala> val command="cleanup"
    command: String = cleanup
    
    scala> commandExecutor(command).apply
    cleanup successfully
    
  5. from https://stackoverflow.com/questions/2060395/is-there-any-scala-feature-that-allows-you-to-call-a-method-whose-name-is-stored by cc-by-sa and MIT license