172 похожих чатов

Https://Play.Rust-Lang.Org/?Version=Stable&Mode=Debug&Edition=2018&Gist=76f11a2180913a8106d05d1a6b291245 Type Duplet = (Cow<'static, str>, Cow<'static, str>); let map: HashMap<Duplet, ()>

= ...;
let s1 = String::new();
let s2 = String::new();

map.get(&(Cow::Borrowed(s1.as_str()), Cow::Borrowed(s2.as_str())));


А почему это компилируется? Тут лайфтаймы контрвариантными становятся?

18 ответов

24 просмотра

Да Вот таблица variance https://doc.rust-lang.org/nomicon/subtyping.html#variance

Max Силинг
Да Вот таблица variance https://doc.rust-lang.org/...

С контравариантными лайфтаймами много проблем, поэтому их пару раз порывались попячить из языка, но уже поздно

Max Силинг
Да Вот таблица variance https://doc.rust-lang.org/...

а какой смысл этого занятия? Просто битфлаги вроде сделаны для того чтобы ты мог сделать A | B. ПРи этом объединить AData | BData не выйдет если у них хотя бы 1 поле совпадает

Αλεχ Zhukovsky
а какой смысл этого занятия? Просто битфлаги вроде...

У меня есть ивенты Клиент посылает запрос на подписку Вот тут требуется поведение как у битфлагов — можно подписаться на A | B Сервер посылает обратно ивенты Тут требуется tagged union — каждый ивент это либо A, либо B плюс данные

folex- Автор вопроса
Max Силинг
Да Вот таблица variance https://doc.rust-lang.org/...

Спасибо! Но в табличке контрвариантны только аргументы функций, а про контрвариантные лайфтаймы я там не вижу 🤔 > NOTE: the only source of contravariance in the language is the arguments to a function, which is why it really doesn't come up much in practice.

folex
Спасибо! Но в табличке контрвариантны только аргум...

Так это и есть аргумент функции Внутри аргумента функции может быть лайфтайм Аргументы функции контравариантны

Max Силинг
Так это и есть аргумент функции Внутри аргумента ф...

Собственно, лайфтаймы это единственная вещь в языке, у которой вообще есть варианс Для всего остального просто не определены отношения сабтайпинга

folex- Автор вопроса
Max Силинг
Так это и есть аргумент функции Внутри аргумента ф...

а, понял. Аргументы функции get же. Спасибо 🙂

Max Силинг
Собственно, лайфтаймы это единственная вещь в язык...

Я только что соврал, у трейтов тоже определён некий ограниченный «сабтайпинг», в частности

folex
а, понял. Аргументы функции get же. Спасибо 🙂

В частности, Box<dyn A + Send> пролезает в Box<dyn A> https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=0132e6b3f228b12945ac979ca27963c3

folex- Автор вопроса
folex
а вот тут я поплыл

Трейт обджекты могут коэрсится к менее строгим трейт обджектам, что на вид выглядит как сабтайпинг Считать это сабтайпингом или коэршном я не уверен С одной стороны, референс утверждает, что > Subtyping in Rust is very restricted and occurs only due to variance with respect to lifetimes and between types with higher ranked lifetimes. https://doc.rust-lang.org/reference/subtyping.html С другой стороны, все коэршны перечислены здесь, и тут такого нет https://doc.rust-lang.org/reference/type-coercions.html

folex- Автор вопроса
folex
а вот тут я поплыл

а, ну хотя всё в порядке же. foo ничего опасного сделать не сможет, всё логично

Max Силинг
Трейт обджекты могут коэрсится к менее строгим тре...

Кстати, интересный вопрос, что тут происходит

Traveller Kolsky
T is Unsize<dyn Trait> when T: Trait

Угу, CoerceUnsized между боксами с одинаковыми аллокаторами https://doc.rust-lang.org/stable/std/ops/trait.CoerceUnsized.html#impl-CoerceUnsized%3CBox%3CU%2C%20A%3E%3E Тогда это коэршн, а не сабтайпинг

Max Силинг
У меня есть ивенты Клиент посылает запрос на подпи...

Я сделал для такого у себя немножко корявый вариант ручками десериалайз написал и обмазался макросами

folex- Автор вопроса

как вот тут

Похожие вопросы

Обсуждают сегодня

а через ESC-код ?
Alexey Kulakov
29
30500 за редактор? )
Владимир
47
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
13
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
program test; {$mode delphi} procedure proc(v: int32); overload; begin end; procedure proc(v: int64); overload; begin end; var x: uint64; begin proc(x); end. Уж не знаю...
notme
6
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
Вот еще странный косяк, подскажите как бороться. Я git clone сделал себе всего embassy и примеры там запускаю. Всё хорошо. Но вот решил в cargo.toml зависимости не как в приме...
Lukutin R2AJP
1
вы делали что-то подобное и как? может есть либы готовые? увидел картинку нокода, где всё линиями соединено и стало интересно попробовать то же в ddl на lua сделать. решил с ч...
Victor
8
Ребят в СИ можно реализовать ООП?
Николай
33
Карта сайта