You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

TypeScript含条件赋值代码转Kotlin的惯用写法问询

Kotlin中改写含赋值的else-if条件(不拆分为多语句块)

我正尝试将以下TypeScript代码转换为Kotlin代码:

if (coefficient == -1 && peekToken(/^\(/, tokens)) value = "1"
    else if (variable = getToken(/^[a-zA-Z]/, tokens)) value = variable;
    else if (number = getToken(/^(\d*\.\d+)|\d+/, tokens)) value = Number(0 + number);

转换后的Kotlin代码如下:

if (coefficient == -1 && peekToken(Regex("""^\("""), tokens) != null) value = "1"
    else if (variable = getToken(Regex("""^[a-zA-Z]"""), tokens) != null) value = variable
    else if (number = getToken(Regex("""^(\d*\.\d+)|\d+"""), tokens) != null) value = (0 + number).toDouble()

第一个if条件正常,但第二个else-if报错:Assignments are not expressions, and only expressions are allowed in this context。需要一种不将else-if转为多语句块的惯用改写方式。


Kotlin不允许将赋值操作作为表达式直接放在条件判断中,不过可以通过run函数实现类似逻辑,既保留else-if的链式结构,又完成赋值与判空:

if (coefficient == -1 && peekToken(Regex("""^\("""), tokens) != null) {
    value = "1"
} else if (run { 
    variable = getToken(Regex("""^[a-zA-Z]"""), tokens)
    variable != null 
}) {
    value = variable
} else if (run { 
    number = getToken(Regex("""^(\d*\.\d+)|\d+"""), tokens)
    number != null 
}) {
    value = (0 + number).toDouble()
}

run函数会执行内部语句块,将最后一行的返回值作为整个表达式的结果,刚好可以作为else-if的判断条件。这种写法既完成了变量赋值,满足Kotlin对条件必须是表达式的要求,同时没有拆分原有的else-if链式结构,逻辑和原代码保持一致。

内容的提问来源于stack exchange,提问作者ekene

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 17:45:01