代码之家  ›  专栏  ›  技术社区  ›  d33tah

错误[e0597]:试图返回&'static时,借用的值的寿命不够长

  •  0
  • d33tah  · 技术社区  · 6 年前

    我正在重写 publicsuffix 板条箱,希望获得更好的性能。我正在使用与引用同名的python库,在简化其数据结构后,我想到了:

    #[derive(Debug)]
    pub struct Node<T> {
        pub name: T,
        pub children: Vec<Node<T>>,
    }
    

    在收到一个信号之前,我觉得自己太懒了,无法实现结构加载,这就是我决定硬编码它的原因。我不断地 error[E0015]: calls in statics are limited to constant functions, struct and enum constructors 当我试图做一些像 pub static root = Node { name: "x", children: vec![]}; ,所以我决定用函数包装它。我以 this file 这需要花很长时间来建造(大约10分钟)。在询问了IRC Rust初学者之后,我得到了一个建议,尝试使用对数组切片的引用,最后得到了以下示例代码:

    #[derive(Debug)]
    pub struct Node<T: 'static> {
        pub name: T,
        pub children: &'static [Node<T>],
    }
    pub fn return_root() -> Node<&'static str> {
        return Node {
            name: "root",
            children: &[Node {
                name: "uk",
                children: &[
                    Node {
                        name: "ac",
                        children: &[][..],
                    },
                    Node {
                        name: "co",
                        children: &[
                            Node {
                                name: "blogspot",
                                children: &[][..],
                            },
                            Node {
                                name: "no-ip",
                                children: &[][..],
                            },
                        ][..],
                    },
                    Node {
                        name: "gov",
                        children: &[Node {
                            name: "service",
                            children: &[][..],
                        }][..],
                    },
                    Node {
                        name: "ltd",
                        children: &[][..],
                    },
                    Node {
                        name: "me",
                        children: &[][..],
                    },
                    Node {
                        name: "net",
                        children: &[][..],
                    },
                    Node {
                        name: "nhs",
                        children: &[][..],
                    },
                    Node {
                        name: "org",
                        children: &[][..],
                    },
                    Node {
                        name: "plc",
                        children: &[][..],
                    },
                    Node {
                        name: "police",
                        children: &[][..],
                    },
                    Node {
                        name: "sch",
                        children: &[Node {
                            name: "*",
                            children: &[][..],
                        }][..],
                    },
                ][..],
            }][..],
        };
    }
    

    playground

    这不会编译,我也不理解错误消息:

    error[E0597]: borrowed value does not live long enough
      --> src/main.rs:9:20
       |
    9  |           children: &[Node {
       |  ____________________^
    10 | |             name: "uk",
    11 | |             children: &[
    12 | |                 Node {
    ...  |
    71 | |             ][..],
    72 | |         }][..],
       | |__________^ temporary value does not live long enough
    73 |       };
       |        - temporary value only lives until here
       |
       = note: borrowed value must be valid for the static lifetime...
       = note: consider using a `let` binding to increase its lifetime
    
    error[E0597]: borrowed value does not live long enough
      --> src/main.rs:11:24
       |
    11 |               children: &[
       |  ________________________^
    12 | |                 Node {
    13 | |                     name: "ac",
    14 | |                     children: &[][..],
    ...  |
    70 | |                 },
    71 | |             ][..],
       | |_____________^ temporary value does not live long enough
    72 |           }][..],
    73 |       };
       |        - temporary value only lives until here
       |
       = note: borrowed value must be valid for the static lifetime...
       = note: consider using a `let` binding to increase its lifetime
    
    error[E0597]: borrowed value does not live long enough
      --> src/main.rs:18:32
       |
    18 |                       children: &[
       |  ________________________________^
    19 | |                         Node {
    20 | |                             name: "blogspot",
    21 | |                             children: &[][..],
    ...  |
    26 | |                         },
    27 | |                     ][..],
       | |_____________________^ temporary value does not live long enough
    ...
    73 |       };
       |        - temporary value only lives until here
       |
       = note: borrowed value must be valid for the static lifetime...
       = note: consider using a `let` binding to increase its lifetime
    
    error[E0597]: borrowed value does not live long enough
      --> src/main.rs:31:32
       |
    31 |                       children: &[Node {
       |  ________________________________^
    32 | |                         name: "service",
    33 | |                         children: &[][..],
    34 | |                     }][..],
       | |______________________^ temporary value does not live long enough
    ...
    73 |       };
       |        - temporary value only lives until here
       |
       = note: borrowed value must be valid for the static lifetime...
       = note: consider using a `let` binding to increase its lifetime
    
    error[E0597]: borrowed value does not live long enough
      --> src/main.rs:66:32
       |
    66 |                       children: &[Node {
       |  ________________________________^
    67 | |                         name: "*",
    68 | |                         children: &[][..],
    69 | |                     }][..],
       | |______________________^ temporary value does not live long enough
    ...
    73 |       };
       |        - temporary value only lives until here
       |
       = note: borrowed value must be valid for the static lifetime...
       = note: consider using a `let` binding to increase its lifetime
    

    有没有办法解决这个问题?

    1 回复  |  直到 6 年前
        1
  •  1
  •   Tim Diekmann suresh madaparthi    6 年前

    创建切片后,再次使用 &[][..] .这将创建一个临时对象,稍后将删除该对象。这是错误的根源。

    当你移除所有的 [..] 来自代码。

    #[derive(Debug)]
    pub struct Node<T: 'static> {
        pub name: T,
        pub children: &'static [Node<T>],
    }
    pub fn return_root() -> Node<&'static str> {
        return Node {
            name: "root",
            children: &[Node {
                name: "uk",
                children: &[
                    Node {
                        name: "ac",
                        children: &[],
                    },
                    Node {
                        name: "co",
                        children: &[
                            Node {
                                name: "blogspot",
                                children: &[],
                            },
                            Node {
                                name: "no-ip",
                                children: &[],
                            },
                        ],
                    },
                    Node {
                        name: "gov",
                        children: &[Node {
                            name: "service",
                            children: &[],
                        }],
                    },
                    Node {
                        name: "ltd",
                        children: &[],
                    },
                    Node {
                        name: "me",
                        children: &[],
                    },
                    Node {
                        name: "net",
                        children: &[],
                    },
                    Node {
                        name: "nhs",
                        children: &[],
                    },
                    Node {
                        name: "org",
                        children: &[],
                    },
                    Node {
                        name: "plc",
                        children: &[],
                    },
                    Node {
                        name: "police",
                        children: &[],
                    },
                    Node {
                        name: "sch",
                        children: &[Node {
                            name: "*",
                            children: &[],
                        }],
                    },
                ],
            }],
        };
    }
    

    playground

    这个 […] 不需要,因为它只从另一个切片创建一个切片,从而生成同一个切片。