Size: a a a

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

2020 March 14

p

polunin.ai in Rust — русскоговорящее сообществo
Matwey Kornilov
а что вместо него?
serde :D
источник

MK

Matwey Kornilov in Rust — русскоговорящее сообществo
map_opt! кажется
источник

MK

Matwey Kornilov in Rust — русскоговорящее сообществo
источник

В

Вафель in Rust — русскоговорящее сообществo
Как компилятор тут выводит тип? O_O

let opt = None;
let res: Option<_> = try { opt? };
assert_eq!(res, None);
dbg!(type_name_val(&res));

[src/main.rs:7] type_name_val(&res) = "core::option::Option<()>"

(playground)
источник

MB

Mikail Bagishov in Rust — русскоговорящее сообществo
Вафель
Как компилятор тут выводит тип? O_O

let opt = None;
let res: Option<_> = try { opt? };
assert_eq!(res, None);
dbg!(type_name_val(&res));

[src/main.rs:7] type_name_val(&res) = "core::option::Option<()>"

(playground)
() - это дефолтный тип.
В будущем дефолтным станет !.
источник

В

Вафель in Rust — русскоговорящее сообществo
Mikail Bagishov
() - это дефолтный тип.
В будущем дефолтным станет !.
А что именно заставляет его использовать дефолтный тип? Почему в подобном коде но без try будет ошибка?
источник

p

polunin.ai in Rust — русскоговорящее сообществo
Вафель
Как компилятор тут выводит тип? O_O

let opt = None;
let res: Option<_> = try { opt? };
assert_eq!(res, None);
dbg!(type_name_val(&res));

[src/main.rs:7] type_name_val(&res) = "core::option::Option<()>"

(playground)
try { } O_O
источник

p

polunin.ai in Rust — русскоговорящее сообществo
Есть крейт А, который предоставляет общите типы данных для крейтов Б и В. Я правильно понимаю, что чтобы их использовать в обоих крейтах (из одного пересылается в другой крейт), необходимо скомпилировать Б и В крейты одним компилятором? Или на разных тоже можно? И что единственный способ чтобы можно было юзать крейт А в крейтах Б и В скомпилированных на разных компиляторах является #[repr(C)] ?
источник

Э

Эрик in Rust — русскоговорящее сообществo
polunin.ai
Есть крейт А, который предоставляет общите типы данных для крейтов Б и В. Я правильно понимаю, что чтобы их использовать в обоих крейтах (из одного пересылается в другой крейт), необходимо скомпилировать Б и В крейты одним компилятором? Или на разных тоже можно? И что единственный способ чтобы можно было юзать крейт А в крейтах Б и В скомпилированных на разных компиляторах является #[repr(C)] ?
Что? Если у тебя одно скомпилированное приложение, то оно вроде как само там всё определит себе для либ, нет? Крейты - это же просто кусок кода, нет? И ты сам решаешь, чем его компилировать. А если ты из одного приложения в другое перекидываешь, то даже один и тот же компилятор тебе не гарантирует одинаковость #[repr(Rust)] типов. Так что либо #[repr(transparent)] поверх #[repr(C)], либо просто #[repr(C)].
источник

p

polunin.ai in Rust — русскоговорящее сообществo
Эрик
Что? Если у тебя одно скомпилированное приложение, то оно вроде как само там всё определит себе для либ, нет? Крейты - это же просто кусок кода, нет? И ты сам решаешь, чем его компилировать. А если ты из одного приложения в другое перекидываешь, то даже один и тот же компилятор тебе не гарантирует одинаковость #[repr(Rust)] типов. Так что либо #[repr(transparent)] поверх #[repr(C)], либо просто #[repr(C)].
Забыл сказать, что крейт Б и крейт В компилируются отдельно, одир из них как dylib.
источник

Э

Эрик in Rust — русскоговорящее сообществo
Динамическая растолиба вроде же не FFI?
источник

p

polunin.ai in Rust — русскоговорящее сообществo
Хз. Я из крейта А, скомпилированного в бинарь вызываю через dlopen крейт Б, скомпилированный динамически.
источник

AL

Andrey @ozkriff Lesnikov in Rust — русскоговорящее сообществo
источник

Э

Эрик in Rust — русскоговорящее сообществo
В динамик либе делаешь pub use Trait и уже оттуда тянешь в А.
источник

Э

Эрик in Rust — русскоговорящее сообществo
Или что у тебя там за типы с трейтами.
источник

p

polunin.ai in Rust — русскоговорящее сообществo
Эрик
В динамик либе делаешь pub use Trait и уже оттуда тянешь в А.
Это уже не будет правильно с логической точки зрения. Эти типы используются приоритетно в в крейте А.
источник

Э

Эрик in Rust — русскоговорящее сообществo
Ну и что? Без динамик либы всё равно не работает, так какая разница?
источник

p

polunin.ai in Rust — русскоговорящее сообществo
А как тащить типы и трейты в статический бинарь из динамической либы?
источник

Э

Эрик in Rust — русскоговорящее сообществo
А как ты функции вызываешь?
источник

p

polunin.ai in Rust — русскоговорящее сообществo
Разве .so сохраняет сигнатуры типов? Ну и что если этих типов не будет в либе? Мне кажется ты предлагаешь не возможное. Конструировать в бинаре структуры, схема которых приходит в динамической либе.

А функции вызываются по их символу в .so файле.
источник