< 返回版块

wandercn 发表于 2021-08-31 16:10

Tags:算法 前缀树

fn insert(mut self, url_rule: &str) {
        let mut current = self.clone(); // 作为游标指针使用,好像没有达到游标的效果
        let list = parse_path(url_rule);
        for word in &list {
            let mut is_exist = false;
            for n in current.child() {
                if n.name == word.to_string() {
                    is_exist = true;
                    current = n.clone();
                    break;
                }
            }

            if is_exist {
                continue;
            }
            let mut node = Tree::new(word);
            if is_variable(word) {
                node.is_variable = true
            };
            current.append_child(&node);
            current = node.clone()
        }

        current.rule = url_rule.to_string();
        current.is_end = true;
    }

上面的current游标我应该用什么类型指针,因为是自定义类型Tree,绑定只能用Clone。怎么用引用指针修改子节点的数据 golang的实现在https://github.com/obity/pretree/blob/main/pretree.go这个是没有问题的。rust实在是不会写。


Ext Link: https://github.com/code-translation/pretree/blob/main/src/pretree.rs

评论区

写评论
作者 wandercn 2021-08-31 22:31

感谢大神,继续学习。我就是看了官方文档没看明白,所以实际操作试试。

--
👇
Cupnfish: 给你提了PR了,简单来说就是加了Option来避免不必要的&mut引用,同时去掉了一堆没必要的Clone,建议看看官方文档,这部分涉及所有权,是Rust的精髓,不理解的话,很容易对Rust产生厌恶心理的,影响学习这门语言。。。

Cupnfish 2021-08-31 19:00

给你提了PR了,简单来说就是加了Option来避免不必要的&mut引用,同时去掉了一堆没必要的Clone,建议看看官方文档,这部分涉及所有权,是Rust的精髓,不理解的话,很容易对Rust产生厌恶心理的,影响学习这门语言。。。

作者 wandercn 2021-08-31 16:45

不考虑并发写的问题,确定RefCell指针可以指向子节点并修改对应的数据。我之前试过了没成功。

--
👇
Shieber: 似乎需要 RefCell,而且还要考虑是否并发 insert 的问题,具体有请苦瓜小仔来解答,哈哈哈!

Shieber 2021-08-31 16:35

似乎需要 RefCell,而且还要考虑是否并发 insert 的问题,具体有请苦瓜小仔来解答,哈哈哈!

作者 wandercn 2021-08-31 16:13

哪位大神帮忙改写一下,万分感谢。已经写了单元测试 改了程序直接 Cargo test 就可以验证

1 共 5 条评论, 1 页