kotlin - 如何从字符串名称调用 kotlin 中的函数?
问题描述
给定一个字符串名称列表,是否可以从特定值动态调用正确的方法?
在示例中,invokeMethod 是组成的,但理想情况下它是我需要的。第一个参数是要调用的方法名称,第二个参数是参数列表。
class MethodPicker() {
val commands = listOf("foo", "tango")
fun messageReceiver() {
messageParam : String = "Hi stackoverflow!"
invokeMethod(commands.random(), messageParam) //HOW TO DO THIS IN KOTLIN?, the first parameter is the methodf name and the second one would be the parameters that the method receives
}
fun foo(message: String) {
println(message + "foo!")
}
fun tango(message: String) {
println(message + "tango!")
}
}
解决方案
可能有一种使用反射的方法来做到这一点——但这应该只是最后的手段。(它可能冗长、脆弱、缓慢、难以维护和不安全。对于框架、插件和编译器工具很方便;但对于一般编程,通常有更好的方法。)
除了名称之外,这里的一种方法是存储对它应该调用的函数的引用。
您可以使用这样的简单类来存储它们:
class Method(val name: String, val method: (String) -> Unit)
((String) -> Unit
是接受单个 String 参数的函数的类型,并且不返回有用的值。)
您的命令列表可能是:
val commands = listOf(Method("foo", ::foo), Method("tango", ::tango))
(::
为您提供对方法/函数的可调用引用。因为foo()
andtango()
是实例方法,您通常必须提供实例来调用它们,例如myInstance::foo
- 但由于列表是在实例方法中定义的,编译器已经知道.)
你可以调用一个随机函数:
commands.random().method(messageParam)
列出名称和引用可能看起来有点冗长,但它更高效、更安全:编译器可以在运行时检查所有内容,您甚至可以将显示的字符串翻译成不同的语言,而无需全部重写编码。)
推荐阅读
- django - 如何解决 django 表单的“此字段是必需的”
- apache-spark - 优化高负载和 CPU 利用率的 EMR 作业
- android - 在 Flutter 中管理动态小部件状态的正确方法
- reactjs - django 和 axios:如何为 OPTIONS 启用 CORS
- assembly - 在二进制减法中,当没有剩余可以借用的位时如何处理借用形式
- android - Android蓝牙连接问题
- azure - Azure DevOps Pipelines - 具有多个项目的 .NET Core 解决方案 - 如何进行单个构建和多个项目发布?
- c# - 正则表达式匹配一个数字中的 7 个相同数字,无论位置如何
- typescript - 有关如何将 SignalR 实施到 ionic 5 的任何文档?
- linux - 如何使用 yocto 在目标上运行 qmake 工具?