如何实现可在叶子节点扩展的树状数据结构?求助修正Perl6代码
解决方法:用容器存储叶子节点值
你遇到的问题本质是:Perl 6中的Nil是不可变常量,且Pair本身也是不可变的——你没法直接替换一个已存在的Pair,也没法修改Pair里的不可变值。要实现叶子节点的扩展,需要让叶子节点的value是一个可修改的容器,这样我们就能修改容器内的内容,而不是修改不可变的Nil或Pair。
修改后的代码
# 构建树时,让叶子节点的value是一个Scalar容器(初始值为Nil) my $root = a => (b => (c => $ = Nil)); my $here := $root; # 遍历到叶子节点的Pair(也就是c=>$=Nil这个Pair) while $here.value ~~ Pair { $here := $here.value; } # 修改这个Pair的value容器内的值,替换为新的Pair $here.value = d => Nil; # 验证结果 say $root; # 输出:a => (b => (c => d => Nil))
关键修改点解释
- 用容器替代直接的Nil:
把c=>Nil改成c => $ = Nil,这里的$ = Nil创建了一个Scalar容器,初始值为Nil。这个容器是可变的,我们后续可以修改它内部存储的值。 - 修改容器内的值而非Pair本身:
循环结束后,$here指向的是c => $=Nil这个Pair,我们通过$here.value访问这个容器,然后给容器赋值新的d => Nil,这样就完成了叶子节点的扩展。
另一种更灵活的写法(支持多层扩展)
如果需要多次扩展叶子节点,可以把遍历逻辑封装成一个获取叶子容器的函数:
sub get-leaf-container($node) { while $node.value ~~ Pair { $node := $node.value; } return $node.value; } # 初始化树 my $root = a => (b => (c => $ = Nil)); # 第一次扩展 get-leaf-container($root) = d => Nil; # 第二次扩展叶子节点(现在的叶子是d=>Nil) get-leaf-container($root) = e => (f => $ = Nil); say $root; # 输出:a => (b => (c => d => e => (f => Nil)))
这样每次调用get-leaf-container都能直接拿到当前叶子的可修改容器,方便后续扩展。
内容的提问来源于stack exchange,提问作者Theo van den Heuvel
相关产品推荐
相关产品推荐

