Блог*
"Вдребезги" прочитал взахлёб за два дня. 540 страниц, на минуту.
Эту и предыдущую ночи я не спал, читая продолжение: "52 Гц".
Эта книга сходу разбила мне сердце, пропустила осколки сквозь кислоту, прошлась по ним катком, разбросала по всей округе на несколько часов, что я потратил на чтение, а потом аккуратно собрала и склеила вместе — да так, что до сих пор не верится, что оно снова на месте.
Макс Фальк, сукин ты сын, спасибо, ты пишешь замечательно.
Эта книга сходу разбила мне сердце, пропустила осколки сквозь кислоту, прошлась по ним катком, разбросала по всей округе на несколько часов, что я потратил на чтение, а потом аккуратно собрала и склеила вместе — да так, что до сих пор не верится, что оно снова на месте.
Макс Фальк, сукин ты сын, спасибо, ты пишешь замечательно.
🤮27👍4🤔2😱1
Мои дорогие друзья, я хотел бы искренне поздравить вас с наступающими праздниками. Никогда не меняйтесь, оставайтесь всегда такими же! Это пожелание — от всей души, не как эти дурацкие и безликие поздравления, которые народ копирует и пересылает друг другу не читая. Вы — самая лучшая команда по водному поло, с которой мне когда-либо довелось что то видеть! С новым 2013 годом!
🎉32🥴11😁7❤🔥4❤1🤮1
Блог*
#music Я всё ещё считаю, что Bytenommer незаслуженно непопулярен. И этот трек, пожалуй, пока что наилучшее из того, что он сделал. youtube.com/watch?v=Lp2TxF8KTOM
YouTube
9bit Chiptune: Bytenommer – It was the Best of Times
Happy new year 2023 with a new tune!
The chime sample is from pjcohen at Freesound: https://freesound.org/people/pjcohen/sounds/414558/
Twitter: https://twitter.com/bytenommer
Soundcloud: https://soundcloud.com/user-565017399
#9bit #fakebit #8bit #chiptune…
The chime sample is from pjcohen at Freesound: https://freesound.org/people/pjcohen/sounds/414558/
Twitter: https://twitter.com/bytenommer
Soundcloud: https://soundcloud.com/user-565017399
#9bit #fakebit #8bit #chiptune…
Forwarded from Awful Rust snippets for fun and profit
kinda obvious in retrospect
playground
there’s one deref missing and the whole Box gets coerced to dyn Any
playground
🤯5🤬1
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 и абсолютно точная и при этом бестолковая ошибка.
Пусть есть вот такой код:
Посмотрим ещё раз на blanket impl для
Запомним это и перейдём к декларации
Что же происходит в реализации по умолчанию метода
* Компилятор не находит реализации
* ...поэтому также ищет impl-ы, которые позволят скомпилировать со взятием ссылки (то есть фактически
* ...находит, поскольку у нас есть blanket impl, предоставляющий метод
* ...проверяет корректность кода
* ...и наталкивается на ошибку, поскольку для взятия мутабельной ссылки от значения нужно, чтобы само значение было мутабельным, а биндинг
В итоге компилятор и выдаёт такую ошибку, к вящему неудовольствию того несчастного, которому не повезёт напороться на такую ситуацию.
Для сравнения: в C++ нельзя присваивать новое значение this (именно самому
Пусть есть вот такой код:
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 указывает).GitHub
Improve compile error for borrowing mut while missing Sized trait bound · Issue #93078 · rust-lang/rust
Given the following code: trait Modify { fn modify(&mut self) ; } impl<T> Modify for T { fn modify(&mut self) { // ... } } trait Foo { fn mute(&mut self) { sel...
👍10🔥1