ошибка [E0597]: заимствованное значение не живет достаточно долго при попытке вернуть & 'static - PullRequest
0 голосов
/ 30 июня 2018

Я пытаюсь переписать ящик 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![]};, поэтому я решил обернуть его в функцию. Я получил этот файл , на сборку которого уходит вечность (около 10 минут). После запроса IRC # rust-beginners я получил предложение попробовать вместо этого использовать ссылки на кусочки массива и в итоге получил следующий пример кода:

#[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: &[][..],
                    }][..],
                },
            ][..],
        }][..],
    };
}

детская площадка

Это не компилируется, и я не понимаю сообщения об ошибках:

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 Ответ

0 голосов
/ 30 июня 2018

После создания среза вы снова ссылаетесь на него с &[][..]. Это создает временный объект, который впоследствии будет удален. Это источник ошибок.

Вы можете это исправить, удалив все [..] из кода.

#[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: &[],
                    }],
                },
            ],
        }],
    };
}

площадка

[..] не требуется, поскольку он создает срез только из другого среза, что приводит к тому же срезу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...