Есть ли какая-либо функция Scala, которая позволяет Вам называть метод, имя которого хранится в строке?

Принятие Вас имеет строку, содержащую название метода, объект, который поддерживает тот метод и некоторые аргументы, является там некоторой функцией языка, которая позволяет Вам называть это динамично?

Отчасти как Ruby send параметр.

18
задан Myles Gray 24 February 2011 в 15:59
поделиться

2 ответа

Это можно сделать с помощью рефлексии на Java:

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)

И если Вы хотите, чтобы в Scala это было легко, Вы можете сделать класс, который делает это за Вас, плюс неявный для преобразования:

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 в ссылке выше--добавление, которое поможет, если вы попытаетесь использовать операторы)

.
32
ответ дан 30 November 2019 в 06:59
поделиться

Да. Это называется отражением. Вот ссылка на один из способов, используя некоторые экспериментальные вещи Однако вы должны помнить, что Scala не является динамическим языком, и может быть не в состоянии легко выполнять некоторые вещи, которые могут сделать языки сценариев. Вы, вероятно, лучше выполняете совпадение на строке, а затем вызывая правильный метод.

6
ответ дан 30 November 2019 в 06:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: