Принятие Вас имеет строку, содержащую название метода, объект, который поддерживает тот метод и некоторые аргументы, является там некоторой функцией языка, которая позволяет Вам называть это динамично?
Отчасти как Ruby send
параметр.
Это можно сделать с помощью рефлексии на 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 в ссылке выше--добавление, которое поможет, если вы попытаетесь использовать операторы)
.Да. Это называется отражением. Вот ссылка на один из способов, используя некоторые экспериментальные вещи Однако вы должны помнить, что Scala не является динамическим языком, и может быть не в состоянии легко выполнять некоторые вещи, которые могут сделать языки сценариев. Вы, вероятно, лучше выполняете совпадение на строке, а затем вызывая правильный метод.