LINUX.ORG.RU

История изменений

Исправление 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 иногда хуже, иногда лучше.

Я говорю о том, почему статические функции хуже конструктора, и почему это многократно усугубляется отсутствием исключений в Расте.