Forwarded from Технологический Болт Генона
Новость оцениваю положительно, но чо та на Опёнке минусов напихали
Разработчики репозитория Python-пакетов PyPI (Python Package Index) объявили о решении перевести все учётные записи пользователей, сопровождающих хотя бы один проект или входящих в курирующие пакеты организации, на обязательное применение двухфакторной аутентификации. Перевод планируют завершить до конца 2023 года. До намеченного срока будет проведено поэтапное ограничение доступной функциональности для разработчиков, не включивших двухфакторную аутентификацию.
PyPI переходит на обязательную двухфакторную аутентификацию
https://www.opennet.ru/opennews/art.shtml?num=59198
Разработчики репозитория Python-пакетов PyPI (Python Package Index) объявили о решении перевести все учётные записи пользователей, сопровождающих хотя бы один проект или входящих в курирующие пакеты организации, на обязательное применение двухфакторной аутентификации. Перевод планируют завершить до конца 2023 года. До намеченного срока будет проведено поэтапное ограничение доступной функциональности для разработчиков, не включивших двухфакторную аутентификацию.
PyPI переходит на обязательную двухфакторную аутентификацию
https://www.opennet.ru/opennews/art.shtml?num=59198
👍6🖕4🤔2
#prog #rust
Пусть есть вот такой не шибко сложный код:
Кто-то посчитал это багом и сделал issue, но, как оказалось, это ожидаемое поведение. Это опирается на два факта:
* unsize coercion работает через один уровень индирекции, но не через два;
* type coercions не работают в случае, если требуется вывести тип.
Для компилирования этого кода значение
1. Преобразование не может пройти в привязке
2. Преобразование не может пройти по месту вызова
3. Преобразование не может пройти по месту присваивания значения полю
Что же можно сделать для того, чтобы заставить код компилироваться? Есть несколько путей.
1. Добавить coercion site по месту
3. Разнести вывод типов и type coercion:
Так что вот вам случай, когда
Пусть есть вот такой не шибко сложный код:
use std::rc::Rc;
struct Thing;
trait Trait {}
impl Trait for Thing {}
struct Holder {
inner: Rc<dyn Trait>,
}
fn f() {
let thing = Rc::new(Thing);
let holder = Holder {
inner: Rc::clone(&thing),
};
}
Этот код не компилируется:error[E0308]: mismatched types
--> src/lib.rs:14:26
|
14 | inner: Rc::clone(&thing),
| --------- ^^^^^^ expected `&Rc<dyn Trait>`, found `&Rc<Thing>`
| |
| arguments to this function are incorrect
|
= note: expected reference `&Rc<dyn Trait>`
found reference `&Rc<Thing>`
Кто-то посчитал это багом и сделал issue, но, как оказалось, это ожидаемое поведение. Это опирается на два факта:
* unsize coercion работает через один уровень индирекции, но не через два;
* type coercions не работают в случае, если требуется вывести тип.
Для компилирования этого кода значение
thing
типа Rc<Thing>
требуется преобразовать в Rc<dyn Trait>
. Для этого преобразования требуется coercion site.1. Преобразование не может пройти в привязке
Rc::new(Thing)
к thing
, поскольку к имени не приписан явно тип.2. Преобразование не может пройти по месту вызова
Rc::clone
, поскольку выражение &thing
имеет тип &Rc<Thing>
, которое не может быть преобразовано в &Rc<dyn Trait>
из-за двойной индирекции (Rc
уже является указателем).3. Преобразование не может пройти по месту присваивания значения полю
inner
. Так как был сделан вызов Rc::clone
, что де-факто сокращение для <Rc<_> as Clone>::clone
и требует вывода типов, coercion не рассматривается. Поэтому тип функции выводится для точного совпадения возвращаемого типа с ожидаемым в этом месте, то есть как <Rc<dyn Trait> as Clone>::clone
. Аргумент для функции должен быть, таким образом, &Rc<dyn Trait>
, что не работает (см. пункт 2).Что же можно сделать для того, чтобы заставить код компилироваться? Есть несколько путей.
1. Добавить coercion site по месту
let
, то есть явно написать тип:let thing: Rc<dyn Trait> = Rc::new(Thing);
2. Убрать необходимость в выводе типов по месту вызова Rc::clone
. Для этого можно воспользоваться синтаксисом метода:let holder = Holder {
inner: thing.clone(),
};
В этом случае тип выражения thing.clone()
однозначно выводится, как Rc<dyn Trait>
, и потому unsize coercion происходит по месту присвоения значения полю структуры.3. Разнести вывод типов и type coercion:
let another_thing = Rc::clone(&thing);
let holder = Holder {
inner: another_thing,
};
В этом случае unsize coercion происходит опять по месту присвоения значения поля, а создание another_thing
однозначно выводит тип another_thing
, как Rc<Thing>
.Так что вот вам случай, когда
Rc::clone
хуже, чем .clone()
, вопреки линтам.GitHub
Directly passing Rc::clone(...) to a function expecting Rc<dyn Trait> produces unexpected type error · Issue #75240 · rust-lang/rust
Summary Given some struct S that implements a trait T, attempting to pass Rc::clone(&s) (where s has type Rc<S>) as an argument that should have type Rc<dyn T> produces the compiler...
🤔13👍4🤯3🖕2
Forwarded from There will be no singularity
investors: do you use AI in your startup?
me: for what?
investors:
me: for what?
investors:
🌚14😁6🤯2🤡2😐2🖕1
Котики - то святе!
Photo
Я, конечно, понимаю, что какой-то хейтер проставил "🖕" сплошняком по всем последним постам, но на посте с котятами? Серьёзно?
🖕22💔16🤡4🤔3🍌2
Forwarded from Расстройство и предзаказы
fluke - счастливая случайность #дизордерпознавательный
❤🔥12😢4🖕2👍1🤮1
А что, если мне ежедневно постить на канале опрос, который не релевантен к теме канала и ни к чему не обязывает, при этом не собирать статистику, и этим отмазываться от претензий, что я ничего не выкладываю, не смотря на то, что опросы можно накидать отложенными постами на месяц вперёд, и тем самым скрыть тот факт, что своего контента у меня толком и нету, а тот, что есть — в основном малоинтересные внеконтекстные кусочки личной жизни и жалобы на то, какой я нехороший, вопреки свидетельствам обратного?
Да не, бред какой-то.
Да не, бред какой-то.
😁10😐10👎7❤3👍1🤔1🖕1
Антон: не любит рабочие созвоны и в принципе общаться с людьми, предпочитает писать код
Тоже Антон: спланировал рабочий созвон и будет писать план встречи
Тоже Антон: спланировал рабочий созвон и будет писать план встречи
👍6🖕2😭1
Forwarded from AlexShell Makise
Всё просто: говорят, что ты дебил и лучше б ты сдох, чем такое говно писал - значит такой код писать не надо. Скинули на тебя работу других - значит код был хорош.
🤔10🖕3👎2😭2
#prog #rust #serde #suckassstory
t.iss.one/psauxww/923
И да, де-факто эта строчка-индикатор настолько часто захардкожена в проектах на Rust, что есть предложение сделать её публичной.
t.iss.one/psauxww/923
И да, де-факто эта строчка-индикатор настолько часто захардкожена в проектах на Rust, что есть предложение сделать её публичной.
Telegram
Segment@tion fault
У serde_json есть такая "приятная" особенность, как поддержка arbitrary precision numbers.
Оно, безусловно, хорошо в тех кейсах, где действительно нужна длинная математика. Но рассмотрим такой пример:
Alice
let val: serde_json::Value = json!({"number":1234567890});…
Оно, безусловно, хорошо в тех кейсах, где действительно нужна длинная математика. Но рассмотрим такой пример:
Alice
let val: serde_json::Value = json!({"number":1234567890});…
😱6🖕1