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

Kotlin中是否存在Ruby Flip Flop Operator的等效实现?

Kotlin中Ruby Flip-Flop运算符的等效实现

Kotlin并没有原生提供类似Ruby的flip-flop运算符,但可以通过状态变量或者封装高阶函数的方式,实现完全等效的逻辑。

直接用状态变量模拟(对应示例场景)

针对你提到的解析带indent/dedent标记文件的场景,我们可以用一个布尔变量跟踪当前是否处于缩进块内,逻辑和Ruby的运算符行为完全一致:

import java.io.File

fun main() {
    val lines = File("somefile").readLines()
    var inIndentBlock = false

    lines.forEach { line ->
        when {
            line.matches(Regex("^indent")) -> {
                inIndentBlock = true
                println("  $line")
            }
            line.matches(Regex("^dedent")) -> {
                println("  $line")
                inIndentBlock = false
            }
            inIndentBlock -> println("  $line")
            else -> println(line)
        }
    }
}

封装成可复用的高阶函数

如果需要在多个场景复用类似flip-flop的逻辑,可以把状态跟踪逻辑封装成一个高阶函数,让使用方式更接近Ruby的运算符:

// 封装flip-flop逻辑的高阶函数
fun <T> flipFlop(
    startTrigger: (T) -> Boolean,
    endTrigger: (T) -> Boolean
): (T) -> Boolean {
    var isActive = false
    return { item ->
        // 先检查是否触发起始条件
        if (startTrigger(item)) {
            isActive = true
        }
        // 记录当前状态作为返回值
        val currentState = isActive
        // 最后检查是否触发结束条件
        if (endTrigger(item)) {
            isActive = false
        }
        currentState
    }
}

用这个函数处理示例场景的代码会更简洁:

import java.io.File

fun main() {
    val lines = File("somefile").readLines()
    val inIndentBlock = flipFlop(
        startTrigger = { it.matches(Regex("^indent")) },
        endTrigger = { it.matches(Regex("^dedent")) }
    )

    lines.forEach { line ->
        println(if (inIndentBlock(line)) "  $line" else line)
    }
}

这个高阶函数的行为和Ruby的flip-flop完全一致:当元素满足startTrigger时开始返回true,直到遇到满足endTrigger的元素(该元素也会返回true),之后恢复返回false。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 23:25:27