Size: a a a

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

2020 March 15

p

polunin.ai in Rust — русскоговорящее сообществo
Эрик
&i32 == size_of<usize>
&[i32] == (size_of<usize> * 2)
И где тут константа?
Так тут две разные ссылки
источник

В

Вафель in Rust — русскоговорящее сообществo
Эрик
Делаешь struct Yoba { _marker: PhantomData<_>, unsized: [()] }, но size_of::<&Yoba>() выдаст тебе size_of::<usize>() * 2, независимо от того, как ты хочешь определить ссылку для своего !Sized типа.
1) как ты хочешь определять поведение ссылок для твоего типа?...
2) вероятно никогда, т.к. я думаю есть приличное кол-во unsafe кода который может опираться на размер ссылок например
источник

Э

Эрик in Rust — русскоговорящее сообществo
Вафель
2 константы
Вот. А я хочу, чтобы ссылка на мой !Sized тип была толще двух usize'ов. Мне двух не хватает. А если делать без магии ссылок, то до сих пор не сделали const trait и код приходится дублировать для refMyType и mutrefMyType.
источник

Э

Эрик in Rust — русскоговорящее сообществo
&mut Yoba можно сунуть в fn foo(s: &Yoba); а вот mutrefMyType только через .into().
источник

В

Вафель in Rust — русскоговорящее сообществo
Эрик
Вот. А я хочу, чтобы ссылка на мой !Sized тип была толще двух usize'ов. Мне двух не хватает. А если делать без магии ссылок, то до сих пор не сделали const trait и код приходится дублировать для refMyType и mutrefMyType.
Зачем тебе хранить данные именно в ссылке, почему ты не можешь хранить их в структуре?
источник

p

polunin.ai in Rust — русскоговорящее сообществo
Эрик
Вот. А я хочу, чтобы ссылка на мой !Sized тип была толще двух usize'ов. Мне двух не хватает. А если делать без магии ссылок, то до сих пор не сделали const trait и код приходится дублировать для refMyType и mutrefMyType.
Зачем тебе что-то делать с ссылкой?
источник

Э

Эрик in Rust — русскоговорящее сообществo
Вафель
Зачем тебе хранить данные именно в ссылке, почему ты не можешь хранить их в структуре?
Представим, что у тебя есть слайс. И тебе надо взять от него кусок, скажем (2..100). Если ты хранишь длину перед данными, то придётся копировать все элементы с 2 до 100 в новый слайс, потому что ты длину не отдельно хранишь.
источник

Э

Эрик in Rust — русскоговорящее сообществo
polunin.ai
Зачем тебе что-то делать с ссылкой?
Потому что программисты ленивы и не хотят писать .into(), чтобы превратить &mut _ в &_.
источник

Э

Эрик in Rust — русскоговорящее сообществo
Представь, что тебе бы пришлось явно превращать &mut [T] в &[T] каждый раз с помощью .into().
источник

Э

Эрик in Rust — русскоговорящее сообществo
Когда вызываешь .len() метод, или любой другой, принимающий &, а не &mut.
источник

Э

Эрик in Rust — русскоговорящее сообществo
Хотя нет, даже просто .into() не выйдёт, потому что надо тип указать, в который превращаешь. Ты же можешь иметь ввиду .into<Self>() !
источник

Э

Эрик in Rust — русскоговорящее сообществo
То есть refmutMyType должен иметь что-то вроде fn as_ref(self) -> refMyType {}, или тупо дублировать все методы refMyType.
источник

Э

Эрик in Rust — русскоговорящее сообществo
Хм, as_ref(self) не зайдёт, потому что, например,

let a = mutref...;
a.as_ref().len();
a.sort();

Не выйдет сделать.
источник

p

polunin.ai in Rust — русскоговорящее сообществo
Эрик
Представь, что тебе бы пришлось явно превращать &mut [T] в &[T] каждый раз с помощью .into().
Не использую &mut
источник

Э

Эрик in Rust — русскоговорящее сообществo
А два refmutMyType - UB.
источник

Э

Эрик in Rust — русскоговорящее сообществo
Или даже refmutMyType с refMyType.
источник

p

polunin.ai in Rust — русскоговорящее сообществo
Эрик
Когда вызываешь .len() метод, или любой другой, принимающий &, а не &mut.
Насколько помню на &mut T можно вызывать методы принимающие &T
источник

D

Denis in Rust — русскоговорящее сообществo
дичь какая-то происходит
источник

D

Denis in Rust — русскоговорящее сообществo
Эрик
Когда в расте появится возможность определять размер для &(mut) T, где T: !Sized ? Прямо сейчас ссылки на безразмерный тип константно захаркожены в качестве двух usize'ов.
источник

r

red75prime in Rust — русскоговорящее сообществo
Эрик
Хотя нет, даже просто .into() не выйдёт, потому что надо тип указать, в который превращаешь. Ты же можешь иметь ввиду .into<Self>() !
Можно конвертировать на стороне вызываемой функции. https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=059d4b9322dcb12f3ccc8e5d7114eeca
источник