числа А и B и возвращаю их сумму как результат функции. Разве не достаточно информации уже компилятору что бы понять что нужно использовать самый строгий из лайфтаймов от А или B, которые переданы в качестве аргументов ?
Достаточно, в хаскелле вообще так boundы выводятся, этого дизайн-решения раста так не делать
Разве это не проблема яйца и курицы? Откуда брать ЛТ - из параметров переданных или из тела функции? По идее, проблему решили тем, что анализатор не лезет в код, а читает только сигнатуру
Ну выводить только если не указаны, не?
Выводить из чего? Из переданных параметров или из кода внутри?
Я очень плохо понимаю как этот вывод работает, но по идее можно с начала пробовать из параметров, а потом уже из тела
Сейчас никак не работает - есть правила, которые просто расставляют параметры
О ЛТ в сигнатуре
Ну вот их компилятор в некоторых случаях выводит, разве нет?
Нет, есть правила, которые он просто применяет. Сам он ЛТ в сигнатуре не напишет (то есть семантически он не понимает, равные они или нет)
Туплю, а в чём отличия?
В том, что по правилам у всех инпут параметров функции свой лайфтайм. И компилятору все равно, если это не так. Он не додумывает исходя из кода внутри (или из входных параметров), потому что; как я считаю, это проблема курицы и яйца
Я всё-равно честно говоря не понимаю, где здесь курица и яйцо
А как он посмотрит и поймёт, по сигнатуре сложения? О нет, пошли смотреть внутрь.
Только в случае дженнрика тип подставляет
Из кода функции пытаться понять баунды для ЛТ или из входных параметров? В мое голове тут просто рекурсия при анализе будет
Я про lifetime elision (хз как это перевести)
Так если я все правильно понял и прочитал...Компилятор же вообще не использует лайфтайм ссылки A или B в твоей функции для выхода. Вот к примеру сигнатура твоей функции. fn sum(a: &i32, b: &i32) -> i32 По правилам elision, если выходное значения не является ссылкой, но при этом присутствуют входные ссылки (то бишь параметры которые являются ссылками), то каждая входная ссылка имеет свой лайфтайм. То есть сигнатура твоей функции выглядит на самом деле так. fn sum(a: &'a i32, b: &'b i32) -> i32 При том что сигнатура валидная, можно мне кажется понять что компилятор не использует лайфтаймы входных ссылок в твоей функции.
Обсуждают сегодня