Alexander
У меня уже вырисовывается вопрос, почему в этой ситуации работает .clone()?
Alexander
impl<T: ?Sized> Clone for Arc<T> {
fn clone(&self) -> Arc<T> {
Vladimir
а че б не работать?
Маjко
Не понятно почему для компилера UFCS семантически не равноценен вызову метода через точку
Vladimir
ну через точку же deref coercion.
например так работает app_channel: Some(Arc::clone(&(app_channel as Arc<AppChannel + Send + Sync>)) ) или так Some(Arc::clone(&app_channel) as Arc<AppChannel + Send + Sync>)
Vladimir
а еще лучше при создании явно указать
Vladimir
let app_channel: Arc<AppChannel + Send + Sync> = Arc::new(ac);
Alexander
Очень интересно, почему он тогда не хочет со ссылкой преобразовывать и ругается на непримитивный тип?..
Vladimir
он же написал
Vladimir
что as работает только для примитивных типов
Alexander
Arc<T> - это примитивный?
Vladimir
имея ввиду что нету правил для &Arc<T> -> &Arc<U>
Alexander
Вот. Вопрос, где все эти правила прописаны.
Vladimir
в растбуке
Alexander
Растбук - не исходники стандартной библиотеки.
Или это просто магия компилятора?
Vladimir
https://doc.rust-lang.org/book/first-edition/casting-between-types.html где-то здесь
Vladimir
as это магия компилятора
Vladimir
для смарт принтеров есть https://doc.rust-lang.org/std/ops/trait.CoerceUnsized.html
Vladimir
который позволяет юзать часть магии для либ
Anton
Кстать
Anton
посоны
Anton
вдруг кто в теме
Anton
кто знает хорошие гайдлайны и тд по opengl?
Anton
как рисовать в нем, понимание принципов работы и тд?
Anton
Чтобы потом уже можно было чтото свое фигачить в rust
Filipp
я учил по https://open.gl/
Anton
интересная для меня тема академически на будущее)
Filipp
вроде норм
Kerrigan
читай любой туториал по нему
Kerrigan
только код инициализации отличается
Anton
но ничего рисовать, понимать как делать слои и тд так и не врубился
Anton
Anton
спасибо
Kerrigan
какие ещё слои?
Filipp
теперь мой вопрос: как в сейф-расте сделать, чтобы структура ссылалась на саму себя?
Filipp
Struct SelfRef {s: Option<Rc<SelfRef>>}
Filipp
или че-нить такое
Filipp
или в сейф расте это никак?
Vladimir
Filipp
продолжай
Anton
какие ещё слои?
хочу научится делать отрисованные opengl слои, с плюшками
Anton
как в clutter например
Kerrigan
ты видимо это имел в виду https://www.khronos.org/opengl/wiki/Blending
Vladimir
че еще продолжать х)
Anton
и чтобы мог использовать нормально тот же lyon
Anton
который тоже на opengl
Kerrigan
потому что никаких слоев нет
Filipp
так теперь самое интересное - создать экземпляр
kitsu
Vladimir
ок, тогда у тебя пропущен рефцелл
Vladimir
х)
Filipp
продолжай
Filipp
рефцелл внутри рефкаунтера или снаружи?
Filipp
начнем с простого
Vladimir
Filipp
кажется фундаментальное ограничение в том, что после копирования рефкаунтера его не за борроуить мутабельно
Kerrigan
Vladimir
RefCell обычно внутри
Filipp
а снаружи бутылка
Kerrigan
к слову на мобильных устройствах тебя никакие гайдлайны не спасут
Kerrigan
вендоры косячат как только могут
Vladimir
а снаружи бутылка
https://play.rust-lang.org/?gist=0c74ba2dd6e508658ca526fbdbcc3373&version=stable
Filipp
блин работает
Vladimir
а чеб не работало
Vladimir
примерно в таким в своё время заставили выкинуть Мемори лик из понятия "безопасная работа с памятью"
Vladimir
в расте
Filipp
https://play.rust-lang.org/?gist=26f0e71e86f6e04a96163d351a7f155f&version=stable
еее
Vladimir
и вместе с этим скопед треды
Alexander
Всё это интересно...
"Casting between types" - ничего похожего нет.
"Unsized types" и "Deref coertions" - тоже.
"Trait objects" рассказывает про &Type as &Trait, &mut Type as &mut Trait и Box<Type> as Box<Trait>.
И дальше упоминает "e.g. using &x as an argument to a function that takes &Foo".
Но всё это не раскрывает почему Arc<Type> as Arc<Trait> работает, а &Arc - уже нет, хотя self - это именно &Arc в данном случае.
Ок, это конечно всё придётся запомнить, но что-то существенно важное осталось за кадром.
Filipp
Vladimir
Filipp
Vladimir
А вот про селф не понял
Vladimir
там идет deref coercion