Size: a a a

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

2020 September 25

Э

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

Э

Эрик in Rust — русскоговорящее сообществo
Ilya Lakhin
В либе есть функции, принимающие A, есть функции принимающие B. В большинстве случае то, что принимают через B может быть единообразно сконструировано из A, поэтому дфеолтная имплементация актуальна. Но могут быть случаи, когда нужно сделать специализированную версию для методов, принимающих B, которая не может быть построена из A, и вообще запретить принимать этот объект там, где принимается A
>запретить принимать этот объект там, где принимается A
Негативные баунды только специализация.
источник

Э

Эрик in Rust — русскоговорящее сообществo
Нет, вру, негативных баундов нет даже в специализации.
источник

MB

Mikail Bagishov in Rust — русскоговорящее сообществo
Я от кого-то слышал, что negative баунды на автотрейтах даже сильнее чем специализация
источник

IL

Ilya Lakhin in Rust — русскоговорящее сообществo
Эрик
Ты на вопрос не ответил. Зачем там генерик имплы, если оно у тебя будет на тип имплементиться, то есть impl A for Type, а не impl<T> A for T?
Я не понял вопрос. Что такое генерик имплы?
источник

Э

Эрик in Rust — русскоговорящее сообществo
Это надо делать макросом с автореф специализацией, которая запаникует, если val: A, но даже тут не будет гарантий, потому что fn foo(val: impl B) { spec_macro!(val) } не запаникует.
источник

Э

Эрик in Rust — русскоговорящее сообществo
Ilya Lakhin
Я не понял вопрос. Что такое генерик имплы?
Я же описал буквально в том же предложении.
источник

Э

Эрик in Rust — русскоговорящее сообществo
impl<T> Trait for T — генерик импл.
источник

Э

Эрик in Rust — русскоговорящее сообществo
impl Trait for Type — не генерик импл.
источник

MB

Mikail Bagishov in Rust — русскоговорящее сообществo
Эрик
impl<T> Trait for T — генерик импл.
По-моему это бланкет импл называют
источник

IL

Ilya Lakhin in Rust — русскоговорящее сообществo
Эрик
impl<T> Trait for T — генерик импл.
Я нигде не писал, что мне такое нужно.
источник

Э

Эрик in Rust — русскоговорящее сообществo
Ilya Lakhin
Я нигде не писал, что мне такое нужно.
Юзерам либы, а не тебе. Если не нужно, то пихай

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

Э

Эрик in Rust — русскоговорящее сообществo
Mikail Bagishov
По-моему это бланкет импл называют
А, ну да, название забыл.
источник

IL

Ilya Lakhin in Rust — русскоговорящее сообществo
Эрик
Юзерам либы, а не тебе. Если не нужно, то пихай

impl<T> B for T
where T: A {
fn b() { T::a() }
}
А при этом B можно будет заимплементить на что-нибудь другое для юзеров либы?
источник

MB

Mikail Bagishov in Rust — русскоговорящее сообществo
Mikail Bagishov
Я от кого-то слышал, что negative баунды на автотрейтах даже сильнее чем специализация
Как минимум, они позволяют строить объединение и дополнение тайпклассов.
источник

Э

Эрик in Rust — русскоговорящее сообществo
Только ещё учитывай, что юзеры не смогут сделать и
struct Type;
impl A for Type { fn a() {} }
impl B for Type { fn b() {} }


Потому что уже есть impl B for T: A
источник

Э

Эрик in Rust — русскоговорящее сообществo
Они смогут заимплементить только один трейт — либо
A (+ B),
либо
B.
источник

Э

Эрик in Rust — русскоговорящее сообществo
Ilya Lakhin
А при этом B можно будет заимплементить на что-нибудь другое для юзеров либы?
impl B for Type можно, да.
источник

IL

Ilya Lakhin in Rust — русскоговорящее сообществo
Не, это слишком ограничивает
источник

IL

Ilya Lakhin in Rust — русскоговорящее сообществo
Эрик
impl B for Type можно, да.
А impl A for Type?
источник