= ...;
let s1 = String::new();
let s2 = String::new();
map.get(&(Cow::Borrowed(s1.as_str()), Cow::Borrowed(s2.as_str())));
А почему это компилируется? Тут лайфтаймы контрвариантными становятся?
Да Вот таблица variance https://doc.rust-lang.org/nomicon/subtyping.html#variance
С контравариантными лайфтаймами много проблем, поэтому их пару раз порывались попячить из языка, но уже поздно
а какой смысл этого занятия? Просто битфлаги вроде сделаны для того чтобы ты мог сделать A | B. ПРи этом объединить AData | BData не выйдет если у них хотя бы 1 поле совпадает
У меня есть ивенты Клиент посылает запрос на подписку Вот тут требуется поведение как у битфлагов — можно подписаться на A | B Сервер посылает обратно ивенты Тут требуется tagged union — каждый ивент это либо A, либо B плюс данные
Спасибо! Но в табличке контрвариантны только аргументы функций, а про контрвариантные лайфтаймы я там не вижу 🤔 > 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.
Так это и есть аргумент функции Внутри аргумента функции может быть лайфтайм Аргументы функции контравариантны
Собственно, лайфтаймы это единственная вещь в языке, у которой вообще есть варианс Для всего остального просто не определены отношения сабтайпинга
а, понял. Аргументы функции get же. Спасибо 🙂
Я только что соврал, у трейтов тоже определён некий ограниченный «сабтайпинг», в частности
В частности, Box<dyn A + Send> пролезает в Box<dyn A> https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=0132e6b3f228b12945ac979ca27963c3
а вот тут я поплыл
Трейт обджекты могут коэрсится к менее строгим трейт обджектам, что на вид выглядит как сабтайпинг Считать это сабтайпингом или коэршном я не уверен С одной стороны, референс утверждает, что > 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
а, ну хотя всё в порядке же. foo ничего опасного сделать не сможет, всё логично
Кстати, интересный вопрос, что тут происходит
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 Тогда это коэршн, а не сабтайпинг
Я сделал для такого у себя немножко корявый вариант ручками десериалайз написал и обмазался макросами
как вот тут
Обсуждают сегодня