Давайте немного поговорим о том, почему вообще присваивание
Что действительно является проблематичным — так это
С другой стороны, что, если про изначальный массив
Если вы помните мой пересказ серии статей Oxidizing OCaml, то там был упомянут strong function update — апдейт поля значением иного типа. Как я писал, сделать это in-place возможно только тогда, когда текущее имя уникально ссылается на значение — в противном случае код может по старому имени прочитать значение нового типа как значение старого типа. Апкаст от
К сожалению, одной лишь уникальности недостаточно для обеспечения корректности — нужны ещё линейные (или хотя бы афинные) аннотации на значениях для корректной обработки замыканий, захватывающих уникальные ссылки, что уже довольно сильно влияет на систему типов. Так что такое развитие мы навряд ли увидим в Java — как и в любом языке на JVM, в котором с Java есть интероп.
Также подход с readonly-колекциями одновременно избыточен и недостаточен... Но об этом, пожалуй, в другой раз.
Cat в массив из Animal является небезопасным. Очевидно, в самой функции put_cat у нас есть доступ только к набору значений Animal — без явного каста привести их к какому-то точному типу мы не можем. С другой стороны, Cat апкастится к Animal, который вроде как вполне можно положить в массив Animal. Внутри put_cat никаких проблем нет!Что действительно является проблематичным — так это
dogs на вызывающей стороне. Именно, тип Dog[] апкастится до Animal[] при вызове put_cat — но после вызова put_cat переменная dogs всё ещё доступна! Вызывающая сторона помнит более точный тип dogs, и потому может увидеть, что туда положили Animal, который не обязательно является Dog.С другой стороны, что, если про изначальный массив
dogs мы просто... Забудем? В этом случае мы можем перезаписать значение типом, отличным от изначального — но это нормально, потому что этого всё равно никто не увидит! Таким образом, выкинув последнюю строку из main, мы получим вполне себе нормальную программу с вменяемой семантикой... Которая всё равно будет кидать ArrayStoreException. И это вполне понятно: для того, чтобы определить, что put_cat — безопасная функция, нужно удостовериться, что массив до апкаста после вызова нигде не используется (массив после апкаста можно и сохранить, он не может привести к проблемам). Это требование, однако, никак не выражено в типах, и потому компилятор не может его проверить — иными словами, компилятор не может проверить, что аргумент put_cat не пересекается (или, выражаясь жаргоном, не алиасится) с другими переменными. Вот бы был способ сказать компилятору, что на данное значение ссылается одно и только одно имя... Звучит знакомо?Если вы помните мой пересказ серии статей Oxidizing OCaml, то там был упомянут strong function update — апдейт поля значением иного типа. Как я писал, сделать это in-place возможно только тогда, когда текущее имя уникально ссылается на значение — в противном случае код может по старому имени прочитать значение нового типа как значение старого типа. Апкаст от
Dog[] до Animal[], очевидно, меняет тип, и если мы не хотим копировать значения просто для избегания ломающего систему типов поведения — а мы не хотим — то мы должны удостовериться, что после получения значения типа Animal[] значение типа Dog[] более недоступно — или, иными словами, апкаст сохраняет уникальность ссылки. Если нам получится каким-то образом это сделать, то компилятор сможет дать нам нужную ошибку: именно, указать на то, что dogs используется, не смотря на то, что уникальность была передана.К сожалению, одной лишь уникальности недостаточно для обеспечения корректности — нужны ещё линейные (или хотя бы афинные) аннотации на значениях для корректной обработки замыканий, захватывающих уникальные ссылки, что уже довольно сильно влияет на систему типов. Так что такое развитие мы навряд ли увидим в Java — как и в любом языке на JVM, в котором с Java есть интероп.
Также подход с readonly-колекциями одновременно избыточен и недостаточен... Но об этом, пожалуй, в другой раз.
Telegram
Блог*
Вторая статья: Oxidizing OCaml: Rust-Style Ownership. В ней рассказывается о режиме уникальности значений. У этого режима три возможных значения: shared (вариант по умолчанию), exclusive и unique.
Режим shared говорит о том, что на значение существует произвольное…
Режим shared говорит о том, что на значение существует произвольное…
👍17🔥1
UPD (24.12.2023): знакомый нашёл жильё. Спасибо, помощь больше не требуется.
Здравствуйте, дорогие подписчики. Конкретно сегодня я обращаюсь к тем из вас, кто живёт в Украине. Сегодня одного моего знакомого, который живёт в Киеве, выгнали из дома родители. Это не в первый раз, но теперь знакомый даже не планирует возвращаться. Сейчас он оперативно ищет жильё — желательно в Киеве или в окрестностях. У него сейчас есть место лишь на несколько дней. Планирует оставаться на продолжительный срок, готов оплачивать арендную плату и коммуналку, самому платить за свою еду. В идеале ищет сожителя.
Если кто-то может помочь — пишите ему в личку: @QoiAA.
Репосты желательны.
Здравствуйте, дорогие подписчики. Конкретно сегодня я обращаюсь к тем из вас, кто живёт в Украине. Сегодня одного моего знакомого, который живёт в Киеве, выгнали из дома родители. Это не в первый раз, но теперь знакомый даже не планирует возвращаться. Сейчас он оперативно ищет жильё — желательно в Киеве или в окрестностях. У него сейчас есть место лишь на несколько дней. Планирует оставаться на продолжительный срок, готов оплачивать арендную плату и коммуналку, самому платить за свою еду. В идеале ищет сожителя.
Если кто-то может помочь — пишите ему в личку: @QoiAA.
Репосты желательны.
👍17🤡11❤3😁1😢1
Forwarded from Технологический Болт Генона
🤡24😍1
Forwarded from лидер мнений среди удобрений
This media is not supported in your browser
VIEW IN TELEGRAM
Звучит как бред, но в Яндекс Картах пропало название Эгейского моря. Названия остальных морей на месте, но Эгейское теперь нужно искать через поиск.
Вот до чего антиэгейская пропаганда дошла!
Вот до чего антиэгейская пропаганда дошла!
😁26
лидер мнений среди удобрений
Звучит как бред, но в Яндекс Картах пропало название Эгейского моря. Названия остальных морей на месте, но Эгейское теперь нужно искать через поиск. Вот до чего антиэгейская пропаганда дошла!
Подписчик подсказал — а я проверил и убедился — что название острова Лесбос на карте тоже не отображается
UPD: извините, я случайно наврал, я недостаточно приблизил.
UPD: извините, я случайно наврал, я недостаточно приблизил.
🍌8🤡4
лидер мнений среди удобрений
Звучит как бред, но в Яндекс Картах пропало название Эгейского моря. Названия остальных морей на месте, но Эгейское теперь нужно искать через поиск. Вот до чего антиэгейская пропаганда дошла!
Telegram
РБК
В «Яндексе» объяснили пропажу названия Эгейского моря с карты. Пользователи обратили внимание, что оно не подписано, подпись не появляется и при масштабировании. При этом названия соседних морей на карте присутствуют. Через поиск Эгейское море найти удается.…
😁6🍌1
Forwarded from 💞Gay Mems🔥 | Гей мемы 💪
ЯГОМИК В С Ё
«Якутский государственный объединённый музей истории и культуры» переименовали и теперь он называется просто «Якутский музей».
Сначала мы потеряли ВСЕГЕИ, теперь ЯГОМИК, что дальше?
«Якутский государственный объединённый музей истории и культуры» переименовали и теперь он называется просто «Якутский музей».
Сначала мы потеряли ВСЕГЕИ, теперь ЯГОМИК, что дальше?
🤡17😁8🌚2😭1
