从 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)
有什么方法可以将一个字符(假设值为“+”)转换为运算符 +?像这样:
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)