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
相关产品推荐
相关产品推荐

