История изменений
Исправление Siborgium, (текущая версия) :
В подавляющем числе случаев new, иногда билдеры. Да и зачем документация?
Можешь, если сам не поставишь констрейнт.
Нет, не могу.
fn foo<T>() -> T {
T::new()
}
error[E0599]: no function or associated item named `new` found for type parameter `T` in the current scope
--> main.rs:4:8
|
4 | T::new()
| ^^^ function or associated item not found in `T`
Семантически у T
затерт тип, я ничего с голым T
сделать не могу, кроме как передать его или ссылку на него куда-то. «Констрейнт» правильнее понимать не как ограничение T
, а, наоборот, как дополнение исходно пустого множества допустимых операций над T
.
А если нужно, то в С++ ты точно также не сможешь сделать с типом того, что для него не реализовано
Пусть у меня есть структурка вида
struct S { }
impl S {
pub fn new() -> Self { S{} }
}
Для нее new реализован. Функция выше все еще не компилируется, даже если я напишу где-нибудь в main
let s: S = foo();
Реализуется через замыкания: Foo::with(|| Bar { .. }).
Не реализуется. Владение безусловно передается в замыкание. Куда оно передастся дальше – неважно, исходный владелец объект безусловно теряет. Из-за проблемы выше сама конструкция особого смысла не имеет, обобщенный код с ее помощью писать нельзя.
Почему это хуже исключений?
Почему это хуже исключений – отдельный вопрос, о котором я ничего не говорил. Конкретно возврат Result иногда хуже, иногда лучше.
Я говорю о том, почему статические функции хуже конструктора, и почему это многократно усугубляется отсутствием исключений в Расте.
Исходная версия Siborgium, :
В подавляющем числе случаев new, иногда билдеры. Да и зачем документация?
Можешь, если сам не поставишь констрейнт.
Нет, не могу.
fn foo<T>() -> T {
T::new()
}
error[E0599]: no function or associated item named `new` found for type parameter `T` in the current scope
--> main.rs:4:8
|
4 | T::new()
| ^^^ function or associated item not found in `T`
Семантически у T
затерт тип, я ничего с голым T
сделать не могу, кроме как передать его или ссылку на него куда-то.
А если нужно, то в С++ ты точно также не сможешь сделать с типом того, что для него не реализовано
Пусть у меня есть структурка вида
struct S { }
impl S {
pub fn new() -> Self { S{} }
}
Для нее new реализован. Функция выше все еще не компилируется, даже если я напишу где-нибудь в main
let s: S = foo();
Реализуется через замыкания: Foo::with(|| Bar { .. }).
Не реализуется. Владение безусловно передается в замыкание. Куда оно передастся дальше – неважно, исходный владелец объект безусловно теряет. Из-за проблемы выше сама конструкция особого смысла не имеет, обобщенный код с ее помощью писать нельзя.
Почему это хуже исключений?
Почему это хуже исключений – отдельный вопрос, о котором я ничего не говорил. Конкретно возврат Result иногда хуже, иногда лучше.
Я говорю о том, почему статические функции хуже конструктора, и почему это многократно усугубляется отсутствием исключений в Расте.