我在学习kotlin,想知道如何在const中添加函数,
这里的JS例子..。
function suma (a, b){
return a + b
}
console.log("sua suma::", suma(2,3))
function multiplica (a, b){
return a * b
}
console.log("sua multiplik::", multiplica(2,3))
const operations = {
suma,
multiplica
}
console.log ("sum of first class::", operations.suma(2,3))
console.log ("mult of first class::", operations.multiplica(2,3))那么,我如何在Kotlin身上实现同样的目标呢?
在这里,我已经尝试过:
fun suma(a: Int, b: Int): Int{
return a + b
}
fun multiplica (a: Int, b: Int): Int{
return a * b
}
const operations = {
suma(),
multiplica()
}
fun main() {
println("sua suma:: ${suma(2, 3)}")
println("sua multiplica:: ${multiplica(2, 3)}")
println("sua multiplica:: ${operations.multiplica(2,3)}")
}发布于 2020-11-12 08:42:47
它可以使用object关键字来完成,如下所示:
fun suma(a: Int, b: Int): Int {
return a + b
}
fun multiplica(a: Int, b: Int): Int {
return a * b
}
fun main() {
val operations = object {
val _suma = ::suma
val _multiplica = ::multiplica
}
println("sua suma:: ${operations._suma(2, 3)}")
println("sua multiplica:: ${operations._multiplica(2, 3)}")
}唯一的缺点是您必须为operations.XXXXX选择一个与引用函数的名称不同的名称:注意,var _suma与fun suma。否则编译器将考虑递归问题。
发布于 2020-11-12 06:10:00
const的“只允许原语和字符串”
您要找的操作员是:(双冒号)
这方面的一个实例是
enum class Operations(function: KFunction<Int>) {
Suma(function = ::suma),
Multiplica(function = ::multiplica)
}发布于 2020-11-12 06:33:30
这里的主要问题是Kotlin是一种静态类型化的语言,不像Javascript那样对包含任意属性的对象有相同的想法。
我对Kotlin有点陌生,所以也许有更好的方法来做这件事,但是我要做的是定义一个Map来做同样的事情:
fun suma(a: Int, b: Int): Int{
return a + b
}
fun multiplica (a: Int, b: Int): Int{
return a * b
}
val operations: Map<String, (a: Int, b:Int) -> Int> = hashMapOf(
"suma" to ::suma,
"multiplica" to ::multiplica)
fun main() {
println("sua suma:: " + operations.get("suma")?.invoke(2, 3))
println("sua multiplica:: " + operations.get("multiplica")?.invoke(2, 3))
}结果:
sua suma:: 5
sua multiplica:: 6请注意,operations是一个不可变的映射(“const”),因为它的内容一旦定义就不能更改。
访问和必须使用invoke似乎有点混乱。这似乎是因为Map只能包含可空类型。这就是我认为可能有更好的方法来做这件事的主要原因。
https://stackoverflow.com/questions/64798614
复制相似问题