1.84K subscribers
3.29K photos
130 videos
15 files
3.57K links
Блог со звёздочкой.

Много репостов, немножко программирования.

Небольшое прикольное комьюнити: @decltype_chat_ptr_t
Автор: @insert_reference_here
Download Telegram
Мои дорогие друзья, я хотел бы искренне поздравить вас с наступающими праздниками. Никогда не меняйтесь, оставайтесь всегда такими же! Это пожелание — от всей души, не как эти дурацкие и безликие поздравления, которые народ копирует и пересылает друг другу не читая. Вы — самая лучшая команда по водному поло, с которой мне когда-либо довелось что то видеть! С новым 2013 годом!
🎉32🥴11😁7❤‍🔥41🤮1
Никто:
Антон: едет на такси в ТЦ покупать тапочки
👍71
Forwarded from Лентач
Просто программа передач на 1 января на России 24. Похмелье как рукой снимет
🤮23😁6💩1
10👍4😐2😁1🤮1🤨1
Блог*
Что
Ага
👍4
С новым годом.

Пшол вон, 2022.
👍22🔥2
Forwarded from мне не нравится реальность (вафель 🧇🍓)
ah yes день "и тебя тоже"
Forwarded from Segment@tion fault
assert_eq!(chrono::Local::now().year(), 2023);
🔥16👏2
В СМЫСЛЕ УЖЕ ЯНВАРЬ
😱25🎉5
Forwarded from adhd
ha-ha, Rust moment
kinda obvious in retrospect
playground
there’s one deref missing and the whole Box gets coerced to dyn Any
🤯5🤬1
😁14👍61🔥1🤔1
#prog #rust и преступления по игнорированию статусов стабильности
from lib never-say-never
GitHub
🤯7🤨2
Forwarded from Discussing Rust snippets for fun and profit
Awful Rust snippets for fun and profit
from lib never-say-never GitHub
причём это в целом усложнение
pub trait Get { type Never; }
impl<R> Get for fn() -> R { type Never = R; }
pub type Never = <fn() -> ! as Get>::Never;
👍4
#prog #rust и абсолютно точная и при этом бестолковая ошибка.

Пусть есть вот такой код:

trait Modify {
fn modify(&mut self);
}

impl<T> Modify for T {
fn modify(&mut self) {
// ...
}
}

trait Foo {
fn mute(&mut self) {
self.modify();
}
}

Этот код не компилируется и выдаёт вот такое сообщение об ошибке:

error[E0596]: cannot borrow `self` as mutable, as it is not declared as mutable
--> src/lib.rs:13:9
|
13 | self.modify();
| ^^^^^^^^^^^^^ cannot borrow as mutable

На первый взгляд это выглядит, как полная чепуха: у нас же &mut self, параметр прямо объявлен мутабельным! Однако не всё так просто.

Посмотрим ещё раз на blanket impl для Modify:

impl<T> Modify for T {
fn modify(&mut self) {
// ...
}
}

Тут написано, что трейт Modify реализовывается для некоторого типа T. А вот что тут не написано — так это то, что T удовлетворяет ограничению Sized. Этот трейт — единственный, который добавляется к обобщённым параметрам по умолчанию и, соответственно, Rust имеет синтаксис для того, чтобы это ограничение убрать: ?Sized.

Запомним это и перейдём к декларации Foo:

trait Foo {
fn mute(&mut self) {
self.modify();
}
}

Метод mute имеет реализацию по умолчанию, и так как метод, для которого эта реализация имеется, определён на Self, этот тип не получает никаких ограничений вовсе, в том числе и Sized (и об этом сказано в документации к Sized). Но это не значит, что метод вызвать нельзя! Синтаксис вызова метода может брать ссылку на значение для того, чтобы удовлетворить сигнатуре метода. А подходящая реализация, как ни странно, имеется! Потому что T в impl<T> Modify for T покрывает любые (Sized) типы. Вообще любые. В том числе и... Ссылки.

Что же происходит в реализации по умолчанию метода mute?

* Компилятор не находит реализации Modify для Self...
* ...поэтому также ищет impl-ы, которые позволят скомпилировать со взятием ссылки (то есть фактически (&mut self).modify())...
* ...находит, поскольку у нас есть blanket impl, предоставляющий метод modify для &mut Self (а ссылка — всегда Sized тип)...
* ...проверяет корректность кода <&mut Self as Modify>::modify(&mut self)...
* ...и наталкивается на ошибку, поскольку для взятия мутабельной ссылки от значения нужно, чтобы само значение было мутабельным, а биндинг self — который можно написать явно, как fn mute(self_: &mut Self) { ... } (и за вычетом потери возможности использования синтаксиса вызова через точку это определение эквивалентно) — сам мутабельным не является.

В итоге компилятор и выдаёт такую ошибку, к вящему неудовольствию того несчастного, которому не повезёт напороться на такую ситуацию.

Для сравнения: в C++ нельзя присваивать новое значение this (именно самому this, а не тому, на что this указывает).
👍10🔥1
Блог*
#prog #rust и абсолютно точная и при этом бестолковая ошибка. Пусть есть вот такой код: trait Modify { fn modify(&mut self); } impl<T> Modify for T { fn modify(&mut self) { // ... } } trait Foo { fn mute(&mut self) { self.modify();…
Пока писал пост — вспомнил анекдот про математика и воздушный шар. Попытался найти текст и обнаружил, что к нему придумали продолжение:

...
— А вы, похоже, из управленцев, — заметил математик.
— Я действительно топ-менеджер серьезной компании, — воспрял воздухоплаватель, — Но как вы догадались? Вы видели меня по телевизору?
— Зачем? — удивился математик, — Судите сами: вы не понимаете ни где вы находитесь, ни что вам следует делать, в этом вы полагаетесь на нижестоящих. Спрашивая совета у эксперта, вы ни на секунду не задумываетесь, способны ли вы понять его ответ, и когда оказывается, что это не так — вы возмущаетесь вместо того, чтобы переспросить. Вы находитесь ровно в том же положении, что и до моего ответа, но теперь почему-то обвиняете в этом меня. Наконец, вы находитесь выше других только благодаря дутому пузырю, и если с ним что-то случится — падение станет для вас фатальным.
😁20👍52