Ruby的reconstruct_path函数中<<运算符的作用是什么?
Ruby
reconstruct_path函数中<<运算符的作用说明 运算符核心功能
这段代码里的<<是Ruby数组类的追加运算符(本质是数组实例<<方法的运算符语法糖),作用是把运算符右侧的对象作为单个元素,直接追加到左侧数组的末尾,操作会修改原数组,返回值就是追加完成后的数组。
Ruby里<<是多义运算符,不同上下文有不同作用:除了数组追加,还可以做字符串拼接、整数位左移、打开单例类/作用域,但这段代码里<<左侧是数组字面量[p],只会触发数组追加逻辑。
结合函数递归的运行逻辑
这个函数是路径搜索(BFS/A*等算法)里常见的回溯工具,prev是哈希结构,存的是「节点 => 该节点的上一步前驱节点」的映射,current是当前回溯到的节点,<<在递归回溯的过程中逐层执行,完整流程:
- 递归终止条件:如果
prev里没有当前current节点的记录,说明已经回溯到路径起点,直接返回起点节点值(一般是数字、字符串、符号这类基础类型的节点ID)。 - 递归执行步骤:
- 先递归调用函数本身,拿到从起点到当前节点前驱的路径结果,赋值给变量
p - 执行
[p] << current:先把拿到的前驱路径p包成一个单元素数组,再把当前节点current追加到数组末尾,把得到的数组作为当前层的返回值,传回上一层递归。
- 先递归调用函数本身,拿到从起点到当前节点前驱的路径结果,赋值给变量
执行示例
举个实际调用的例子,假设前驱表prev = {2 => 1, 3 => 2},对应路径为1 → 2 → 3,调用reconstruct_path(prev, 3)的执行过程:
- 第一层递归,current=3,查到前驱是2,递归调用
reconstruct_path(prev, 2) - 第二层递归,current=2,查到前驱是1,递归调用
reconstruct_path(prev, 1) - 第三层递归,current=1,prev里没有1的前驱记录,直接返回整数
1 - 回到第二层:p=1,执行
[1] << 2,得到数组[1, 2],返回给上一层 - 回到第一层:p=[1,2],执行
[[1,2]] << 3,得到结果[[1,2], 3]
补充:示例最终返回的是嵌套数组,是原代码本身的写法导致的,和
<<的行为无关。如果要得到扁平化的标准路径结果[1,2,3],通常会把这行改为p << current,同时把终止分支的返回值改为[current],这也是这类路径重构函数的常规写法。
内容的提问来源于stack exchange,提问作者thony08
相关产品推荐
相关产品推荐

