Я пытаюсь переписать ящик 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
Есть ли способ решить эту проблему?