当前位置: 首页 > 知识库问答 >
问题:

静态编程语言:传递运算符作为函数参数

颛孙安康
2023-03-14

我在Kotlin中有以下功能

fun evaluate(first:Int?, second:Int?) {
    var result = 0
    if (v.equals('*')) {
        result = (first ?: 0) * (second ?: 0)
    } else if (v.equals('+')) {
        result = (first ?: 0) + (second ?: 0)
    } else if (v.equals('-')) {
        result = (first ?: 0) - (second ?: 0)
    } else if (v.equals('/')) {
        result = (first ?: 0) / (second ?: 0)
    }
    return result   
}

我想以某种方式更改它,以便我可以作为第三个参数传递所需的运算符并评估表达式。类似的东西

fun evaluate(first:Int?, second:Int?, op: () -> Unit):Int {
    return (first ?: 0).op(second ?: 0)
}

在这种情况下,如何将运算符作为函数传递?我检查了同样的问题,但不清楚如何使用操作员。

共有3个答案

马业
2023-03-14

您可以尝试这样做:

fun evaluate(first: Int?, second: Int? , v:String ): Int = v.op(first ?: 0, second ?: 0)

fun String.op(first:Int,second:Int):Int = when (this) {
    "*" -> first * second
    "+" -> first + second
//....
    else -> throw Exception()
}       
fun main(args: Array<String>) {
    println(evaluate(2,3,"*"))
    println(evaluate(2,3,"+"))
}
葛修真
2023-03-14

更改()-

在调用端,它this是第一个int,第一个参数是第二个int:{其他-

端木夕
2023-03-14

使用函数类型作为参数编写高阶函数时,可以同时使用内置运算符和lambda表达式进行操作,因此如下所示:

fun evaluate(first: Int?, second: Int?, op: (Int, Int) -> Int): Int {
    return op(first ?: 0, second ?: 0)
} 

可以使用内置运算符调用,例如:

val r1 = evaluate(value1, value2, Int::times) 
val r2 = evaluate(value1, value2, Int::plus)
val r3 = evaluate(value1, value2, Int::minus) 
val r4 = evaluate(value1, value2, Int::div) 

并具有自定义功能:

val r5 = evaluate(value1, value2) { a, b -> (a * a) + b }

现在,您还可以将运算符分配给变量,例如您v

val v: (Int, Int)->Int = Int::times  // typing needed on left to avoid ambiguous alternatives
// and then later...
val r6 = evaluate(value1, value2, v) 

请注意,为签名Int编写的函数。(Int)-

 类似资料:
  • 根据这个问题,一个函数可以作为参数传递给另一个函数,如下所示 类似地,我们也可以从类中传递方法 但是如果我们要传递的方法是静态的(在伴随对象中)呢? 我知道,由于它是静态的,我们可以直接调用该方法,而不必将其作为参数传递,然而,在某些情况下(例如利用现有代码时),这仍然是有用的。

  • 如何将注释实例传递给函数? 我想调用java方法

  • 下面是Groovy的一个示例,它正好代表了我想要实现的目标: 命令行: 这个例子的来源在这里-选项3。 如何读取Kotlin DSL中的pass和值?

  • 我在kotlin文件中定义了这个函数。 想这样从Java调用它 随着 但它给了我 我意识到lambda函数的参数似乎是< code >列表 如果我把类转换成java,我可以很容易地用lambda回调函数调用那个函数。 我做错了什么

  • 我有静态函数,它仅限于一些上下文(例如仅用于文档)。有两种替代方法可以将其定义为顶层函数或对象中的函数。 1. 2. 顶级函数的优点是它没有被包装在一个对象中,缺点是它可以从任何地方访问,没有类名前缀。这种情况有优点还是缺点或最佳实践?

  • 从这篇文章中我知道Java是按值传递的。我来自Java背景,我想知道Kotlin是用什么在它们之间传递值的。比如扩展或方法等。