[SCALA] 당신은 이름이 문자열에 저장되는 방법을 호출 할 수있는 스칼라 기능이 있습니까?
SCALA당신은 이름이 문자열에 저장되는 방법을 호출 할 수있는 스칼라 기능이 있습니까?
이 방법의 이름이 포함 된 문자열, 객체 한 가정이 방법을 일부 인수, 당신이 동적으로 호출 할 수 있도록 몇 가지 언어 기능이 있음을 지원?
루비의 전송 파라미터 등의 종류.
해결법
-
==============================
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.예. 그것은 반사라고. 여기에 한 가지 방법에 대한 링크는 스칼라 동적 언어하지 않고, 쉽게 스크립트 언어가 할 수있는 어떤 일을 할 수 없을 수도 있음을 유의 그러나 일부 실험 재료를 사용합니다. 당신은 아마 더 나은 문자열 된 경기를하고, 다음 오른쪽 메소드를 호출하고 있습니다.
예. 그것은 반사라고. 여기에 한 가지 방법에 대한 링크는 스칼라 동적 언어하지 않고, 쉽게 스크립트 언어가 할 수있는 어떤 일을 할 수 없을 수도 있음을 유의 그러나 일부 실험 재료를 사용합니다. 당신은 아마 더 나은 문자열 된 경기를하고, 다음 오른쪽 메소드를 호출하고 있습니다.
-
==============================
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.
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
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
'SCALA' 카테고리의 다른 글
[SCALA] 스칼라 매크로 : 차이점은 무엇입니까 (일명 타입 체크)이 지정되지 않은 나무 입력 (0) | 2019.11.20 |
---|---|
[SCALA] 추상 유형 / 스칼라 입력 매개 변수 (0) | 2019.11.20 |
[SCALA] 불변의 데이터 구조 파악 (0) | 2019.11.20 |
[SCALA] 왜 하나는 프레임 워크 웹 서버 앞에 HTTP 서버를 사용해야합니까? (0) | 2019.11.20 |
[SCALA] 스칼라와 기능 시도 및 캐치 (0) | 2019.11.20 |