Почему правило времени жизни №2 не применяется к "конструктору" структуры с временем жизни (или любая функции без &self)?
Допустим, у меня есть вот такая структурка:
struct SubstringHolder<'a> {
substring: &'a str,
start: usize,
end: usize,
}
Делаю такую функцию, компилируется без ошибок:
fn create_substring_holder(original: &str, start: usize, end: usize) -> SubstringHolder {
SubstringHolder{substring: original, start, end}
}
Тут вопросов нет, применяется правило времени жизни и указание времени жизни для original не требуется
Но почему в нижеследующем случае требуется напрямую указывать время жизни для original (без этого не компилируется):
impl<'a> SubstringHolder<'a> {
fn new(original: &str, start: usize, end: usize) -> Self {
let mut start_tmp = start;
let mut end_tmp = end;
if start > end {
start_tmp = 0;
}
if end > original.len() {
end_tmp = original.len();
}
Self{substring: original, start: start_tmp, end: end_tmp}
}
}
Почему в случает имплементации структуры не применяется правила вывода:
- If there is exactly one input lifetime, that lifetime is assigned to all output lifetimes.
то есть тут один параметр с временем жизни - original, и он, по идее, должен автоматически быть применен к возвращаемому значению Self. Разве не так?
Ответы (1 шт):
Хотелось бы, конечно, видеть сообщение об ошибке. Но могу догадаться, что проблема в original: &str. Компилятор резонно предполагает, что время жизни original может быть меньше, чем Self. Достаточно будет объявить конструктор
fn new(original: &'a str, start: usize, end: usize) -> Self
тогда компилятор сможет корректно определить время жизни original.