Size: a a a

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

2020 March 15

MK

Matwey Kornilov in Rust — русскоговорящее сообществo
Ща сформулирую
источник

А⚙

Антон ⚙️ in Rust — русскоговорящее сообществo
BANO notIT
Почему не ..var
Синтаксис неоднозначный получается
источник

MK

Matwey Kornilov in Rust — русскоговорящее сообществo
У меня есть функции которые через nom что-то там парсят. nom нынче позволяет пользователю указывать свой тип ошибки. Чтобы настраивать поведение - от полного игнора, до очень подробной информации. Поэтому я тоже возвращаю Result<T, E>.
Но вот для модульных тестов я бы хотел, чтобы E = (), и следующий код компилировался:
assert_eq!(Ok(types::PowerUSB::On), decode(&x));

Сейчас ругается на то что не смог E вывести:
error[E0283]: type annotations required: cannot resolve `_: nom::error::ParseError<&[u8]>`
источник

В

Вафель in Rust — русскоговорящее сообществo
Matwey Kornilov
А как мне заставить Rust выводить тип тогда?
fun::<T>()?
источник

MK

Matwey Kornilov in Rust — русскоговорящее сообществo
А вот чтобы руками не вписывать
источник

p

polunin.ai in Rust — русскоговорящее сообществo
Matwey Kornilov
А вот чтобы руками не вписывать
Почему не хочешь руками писать?
источник

В

Вафель in Rust — русскоговорящее сообществo
Matwey Kornilov
У меня есть функции которые через nom что-то там парсят. nom нынче позволяет пользователю указывать свой тип ошибки. Чтобы настраивать поведение - от полного игнора, до очень подробной информации. Поэтому я тоже возвращаю Result<T, E>.
Но вот для модульных тестов я бы хотел, чтобы E = (), и следующий код компилировался:
assert_eq!(Ok(types::PowerUSB::On), decode(&x));

Сейчас ругается на то что не смог E вывести:
error[E0283]: type annotations required: cannot resolve `_: nom::error::ParseError<&[u8]>`
Ok::<_, ()>(types::PowerUSB::On)
источник

В

Вафель in Rust — русскоговорящее сообществo
Matwey Kornilov
А вот чтобы руками не вписывать
Можно сделать макрос на замену assert_eq, который будет устанавливать тип ошибки, но такое
источник

А⚙

Антон ⚙️ in Rust — русскоговорящее сообществo
red75prime
std::thread::sleep в асинхронном коде не нужен никогда, от слова совсем
Да и в синхронном на самом деле тоже редко нужен
источник

В

Вафель in Rust — русскоговорящее сообществo
Вафель
Можно сделать макрос на замену assert_eq, который будет устанавливать тип ошибки, но такое
или
fn ok<T>(val: T) -> Result<T, ()> {
   val
}
источник

Э

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

Э

Эрик in Rust — русскоговорящее сообществo
Даже Deref не накодить для ссылок отличных от стандарта.
источник

В

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

r

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

Э

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

Э

Эрик in Rust — русскоговорящее сообществo
red75prime
Это только для слайсов толстая ссылка (или указатель) является парой из (указатель на начало, размер). Для трейт-объектов - это (указатель на данные, указатель на vtable)
Но мне не нужны трейтовые объекты, мне нужен толстый указатель, но не из двух юсайзов.
источник

p

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

p

polunin.ai in Rust — русскоговорящее сообществo
А, неправильно прочитал.
Зачем тебе дереференсить !Sized тип?
источник

Э

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

В

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