Size: a a a

Rust — русскоговорящее сообществo

2020 September 25

R

Roman in Rust — русскоговорящее сообществo
eyre::Report
источник

MB

Mikail Bagishov in Rust — русскоговорящее сообществo
Mikail Bagishov
Если либа, то следует давать ньютайп над Box<dyn Error + Send + Sync + 'static>
Реализующий std::error::Error
источник

IL

Ilya Lakhin in Rust — русскоговорящее сообществo
Привет!

Подскажите, пожалуйста, можно ли организовать следующую конструкцию.

Есть два трейта A и B. У обоих есть по методу a() и b() соответственно. Я хочу сделать дефолтную имплементацию для b(), которая будет использовать имплементацию a(), при условии что для B имплементирован A(и только в этом случае).

Так можно сделать?
источник

Э

Эрик in Rust — русскоговорящее сообществo
Ilya Lakhin
Привет!

Подскажите, пожалуйста, можно ли организовать следующую конструкцию.

Есть два трейта A и B. У обоих есть по методу a() и b() соответственно. Я хочу сделать дефолтную имплементацию для b(), которая будет использовать имплементацию a(), при условии что для B имплементирован A(и только в этом случае).

Так можно сделать?
Специализация, nightly, go brr.
источник

IL

Ilya Lakhin in Rust — русскоговорящее сообществo
Эрик
Специализация, nightly, go brr.
А без найтли?
источник

Э

Эрик in Rust — русскоговорящее сообществo
Ilya Lakhin
А без найтли?
У B только один метод?
источник

IL

Ilya Lakhin in Rust — русскоговорящее сообществo
Эрик
У B только один метод?
Да
источник

Э

Эрик in Rust — русскоговорящее сообществo
Можно такое. Но это запретит любые другие генерик имплементации для B из-за возможных конфликтов.

impl<T> B for T
where T: A {
fn b() { T::a() }
}
источник

R

Roman in Rust — русскоговорящее сообществo
Да еще и в других крейтах нельзя будет имплементить B
источник

IL

Ilya Lakhin in Rust — русскоговорящее сообществo
Не, так не пойдет
источник

Э

Эрик in Rust — русскоговорящее сообществo
Roman
Да еще и в других крейтах нельзя будет имплементить B
Для типов можно.
источник

R

Roman in Rust — русскоговорящее сообществo
А то вдруг upstream заимплементит тому типу A
источник

R

Roman in Rust — русскоговорящее сообществo
добавление impl<T> A for T {} считается breaking-change?
источник

R

Roman in Rust — русскоговорящее сообществo
Как orphan-rules смотрят на такое?
источник

Э

Эрик in Rust — русскоговорящее сообществo
Roman
добавление impl<T> A for T {} считается breaking-change?
Циклические зависимости.
источник

Э

Эрик in Rust — русскоговорящее сообществo
Кто первый заимплементил, того и тапки.
источник

R

Roman in Rust — русскоговорящее сообществo
Нет цикла же
источник

Э

Эрик in Rust — русскоговорящее сообществo
Внешний крейт. Чтобы сделать impl A for Type, надо сделать крейт зависимостью,
источник

Э

Эрик in Rust — русскоговорящее сообществo
Если крейт уже сделал impl A for Type, то нельзя в крейте с A заимплементить.
источник

IL

Ilya Lakhin in Rust — русскоговорящее сообществo
Короче, проблема фатически неразрешима?
источник