从 char 转换为运算符 Kotlin

Convert from char to operator Kotlin

有什么方法可以将一个字符(假设值为“+”)转换为运算符 +?像这样:

println(1 charOperator 1);

输出:

2

你可以这样做

infix fun Int.`_`(that: Int) = this + that 

其中反引号对于这个字符是不必要的,但对于其他字符可能是必需的。那你可以试试:

println(2 _ 3) // output: 5

根据评论更新

我的意思是

val expr = input.split(' ')
when (expr[1])
{
    '+' -> return expr[0].toInt() + expr[2].toInt()
    '-' -> return expr[0].toInt() - expr[2].toInt()
    '*' -> return expr[0].toInt() * expr[2].toInt()
    '/' -> return expr[0].toInt() / expr[2].toInt()
    // add more branches
}

但是,我想知道从Kotlin的语法上是否有更好更棘手的解决方案。

这真的不可能。也许您应该添加您当前的解决方案,还有另一种方法可以帮助您。

这里有一个仅使用 +- 计算表达式的偷偷摸摸的解决方案:

val exp = "10+44-12+3"

val result = exp.replace("-", "+-").split("+").sumBy { it.toInt() }

你可以这样使用:

fun operatorFromChar(charOperator: Char):(Int, Int)->Int
{
    return when(charOperator)
    {
        '+'->{a,b->a+b}
        '-'->{a,b->a-b}
        '/'->{a,b->a/b}
        '*'->{a,b->a*b}
        else -> throw Exception("That's not a supported operator")
    }
}

稍后调用:

println(operatorFromChar('+').invoke(1,1))

运算符归根结底是函数。如果您 return 一个具有运算符工作的函数,您可以像调用运算符本身一样调用它,但它永远不会像直接调用运算符那样 "pretty"。

您基本上想要的是 Char 结果 的操作映射。所以,我决定立即 return 结果而不是 lambda。

fun Int.doOperation(charOperator: Char, x: Int) = when(charOperator) {
    '+' -> this + x
    '-' -> this - x
    '/' -> this / x
    '*' -> this * x
    else -> throw IllegalArgumentException("Not supported")
}

使用扩展函数可能 (?) 使语法更好一些。你来决定。

呼叫站点:

println(5.doOperation('+', 6))

您可以使用 beanshell 库中的解释器 class 自动将字符串文本转换为结果 例如

interpreter.eval("equal=2*3")
println(interpreter.get("equal").toString().toDouble().toString())

或者可以使用表达式 class 做同样的事情

fun String.stringToConditionalOperators(): (Boolean, Boolean) -> Boolean {
    return when (this.lowercase(Locale.getDefault())) {
        "and" -> {
            { a: Boolean, b: Boolean ->
                a && b
            }
        }
        "or" -> {
            { a: Boolean, b: Boolean ->
                a || b
            }
        }
        // You can add more operator 
        else -> {
            return { a: Boolean, b: Boolean ->
                a || b
            }
        }
    }
}

用法..

val operator = "AND"
operator.stringToConditionalOperators().invoke(one, two)