Linker Unsafe
220 subscribers
182 photos
24 videos
18 files
859 links
Собираю ржавые и лямбдообразные новости, прикольные цитатки с форумов, ссылки на статьи и всё такое. В-общем, сюда я тащу такие крупицы, которые мне будет жаль потерять в цифровой бездне. Возможно, они покажутся интересными и вам.

Фи сюда: @nlinker
Download Telegram
Forwarded from Fail Cascade
Forwarded from Andrey
видимо, я с кем-то спутал.
isovector - это Сэнди же
Forwarded from Sergey Kucherenko
thinking with types / polysemy
Forwarded from Денис
pub fn run<F, I>(f: F) -> CpuFuture<I>
where
F: FnOnce() -> I + Send + 'static,
I: Send + 'static,
{
let (tx, rx) = oneshot::channel();
POOL.with(|pool| {
pool.execute(move || {
if !tx.is_canceled() {
let _ = tx.send(f());
}
})
});

CpuFuture { rx }
}
Forwarded from Денис
т.е. возможно рейс кондишон
Forwarded from Денис
типа если конец канала дропнули до того, как фактически началось выполнение, то оно и не начнётся
Forwarded from Αλεχ Zhukovsky
а вот то же самое, но с помощью докера
Forwarded from Αλεχ Zhukovsky
собственно, как я в итоге и сделал за 5 минут
Александр Мещеряков:
Всем привет! Помогите разобраться с ошибкой десериализации в serde:

Делаю так:
#[derive(Debug, PartialEq, Eq, Clone, Copy, Serialize, Deserialize)]
#[serde(try_from = "String")]
pub struct CurrencyId(&'static str);

impl TryFrom<String> for CurrencyId {
type Error = String;

fn try_from(value: String) -> Result<Self, Self::Error> {
Ok(Self(Box::leak(value.into_boxed_str())))
}
}

Но при компиляции простой структуры, которая содержит поле CurrencyId, получаю ошибку:
error[E0495]: cannot infer an appropriate lifetime for lifetime parameter 'de due to conflicting requirements
--> test/src/mod.rs:62:5
|
62 | pub currency_id: CurrencyId,
| ^^^
|
note: first, the lifetime cannot outlive the lifetime 'de as defined on the impl at 60:50...
--> test/src/mod.rs:60:50
|
60 | #[derive(Debug, PartialEq, Eq, Clone, Serialize, Deserialize)]
| ^^^^^^^^^^^
= note: ...so that the types are compatible:
expected matching::_IMPL_DESERIALIZE_FOR_MatchingStatus::_serde::de::SeqAccess<'_>
found matching::_IMPL_DESERIALIZE_FOR_MatchingStatus::_serde::de::SeqAccess<'de>
= note: but, the lifetime must be valid for the static lifetime...
= note: ...so that the types are compatible:
expected matching::_IMPL_DESERIALIZE_FOR_MatchingStatus::_serde::Deserialize<'_>
found matching::_IMPL_DESERIALIZE_FOR_MatchingStatus::_serde::Deserialize<'static>

Kitsu:
Нельзя десериализовывать static в принципе, это невалидно. 'static - то, что известно на этапе компиляции. Вам подойдет либо owned структура (String), либо строчка с лайфтаймом (&'a str) от того места, откуда идет десериализации (см. доку серде по аттрибутам).

лан, на самом деле на счет "известно на этапе компиляции" я преувеличил, но истина где-то рядом

Александр Мещеряков:
Но там же стоит #[serde(try_from = "String")], какая ему разница, как я получу данный тип из строки? И да, я могу получить статический строковый срез на этапе выполнения.

Kitsu:
А когда вызвать деструктор у строки?

Этот вариант подразумевает, что в коде будет что-то типо:
fn deserialize<D: Deserialize>(d: D) -> Result<MyType> {
let s: String = d.deserialize_string()?;
let my_type = s.try_from()?;
Ok(my_type)
}

s: String - умерла при выходе из функции, а my_type — нет

red75prime:
Главный вопрос. Куда &str должен указывать? serde по понятным причинам не делает Box::leak(), чтобы получить 'static ссылки.

Александр Мещеряков:
try_from делает Box::leak(value.into_boxed_str()), или я не понял, что вы имеете ввиду

Ну у меня есть TryFrom который гарантированно работает - переводит String в CurrencyId, что-то не пойму, почему этого не достаточно

red75prime:
А зачем такое... неортодоксальное решение? Почему не String или Box<str>?

Александр Мещеряков:
Ну мне нужен именно &'static str в CurrencyId, и этот срез будет браться из статического сервиса, но для упрощения примера я сделал Box::leak для получения &'static str из String

Сути ошибки это не изменило...

red75prime:
Хм. Разве что попробовать #[serde(bound(deserialize = "T: DeserializeOwned"))] на поле currency_id. Даже лучше на типе CurrencyId

Александр Мещеряков:
red75prime @kitsu В общем, единственно работающим вариантом оказалось написать собственный десериализатор:
impl<'de> Deserialize<'de> for CurrencyId {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: Deserializer<'de>,
{
let value = String::deserialize(deserializer)?;
CurrencyId::try_from(value).map_err(<D::Error as de::Error>::custom)
}
}
Мне кажется это баг в serde, он по идее не должен был вообще учитывать статический лайфтайм если я использую TryFrom. Наверное стоит создать issue.
Forwarded from pl 🦑 hk
Forwarded from Kerrigan
это типа легковесных процессов как в эрланге штоле?