#prog #rust
Пара слов о трейте Copy.
Во-первых, это один из "магических" трейтов, помечен атрибутом
В-третьих, как сказано в документации к
Продемонстрирую на примере:
Пара слов о трейте Copy.
Во-первых, это один из "магических" трейтов, помечен атрибутом
#[lang = "copy"]
. Компилятор проверяет, что если тип тем или иным способом задекларирован как Copy
, то и всего его поля должны быть Copy
. Следующий код не компилируется:#[derive(Clone, Copy)]Ошибка:
struct StringHolder(String);
error[E0204]: the trait `Copy` may not be implemented for this type
--> src/lib.rs:1:17
|
1 | #[derive(Clone, Copy)]
| ^^^^
2 | struct StringHolder(String);
| ------ this field does not implement `Copy`
Во-вторых, один и тот же тип не может реализовывать Copy
и Drop
одновременно. Скажем, следующий код не компилируется:#[derive(Clone, Copy)]Ошибка:
struct Primitive;
impl Drop for Primitive {
fn drop(&mut self) {}
}
error[E0184]: the trait `Copy` may not be implemented for this type; the type has a destructorТак как полноценных negative trait bounds в Rust всё ещё нет, ограничение
--> src/lib.rs:1:17
|
1 | #[derive(Clone, Copy)]
| ^^^^ Copy not allowed on types with destructors
Copy
можно использовать как более сильную замену ограничению !Drop
.В-третьих, как сказано в документации к
Copy
, "Copies happen implicitly, for example as part of an assignment y = x
. The behavior of Copy
is not overloadable; it is always a simple bit-wise copy.". С другой стороны, Clone
является супертрейтом Copy
, и наличие реализации Copy
не мешает вызывать .clone()
явно. Однако, в отличие от Copy
, Clone::clone
в принципе может вызывать любой код. Поэтому, в частности, технически замена в итераторной цепочке .cloned()
на .copied()
является ломающим изменением, даже если элементы итератора реализуют Copy
.Продемонстрирую на примере:
use std::cell::Cell;Если запустить этот код, то он напечатает
struct Counter<'a>(&'a Cell<u32>);
impl Clone for Counter<'_> {
fn clone(&self) -> Self {
self.0.set(self.0.get() + 1);
Self(self.0)
}
}
fn main() {
let n = Cell::new(0);
let arr = [Counter(&n), Counter(&n), Counter(&n)];
arr.iter().cloned().for_each(drop);
println!("`Counter::clone` called {} times", n.get());
}
`Counter::clone` called 3 times
. Теперь добавим к определению Counter
аннотацию #[derive(Copy)]
и допишем в main
тот же код, что там есть, но с заменой .cloned()
на copied()
:fn main() {Код теперь выводит:
// ...
let n = Cell::new(0);
let arr = [Counter(&n), Counter(&n), Counter(&n)];
arr.iter().copied().for_each(drop); // изменение в этой строке
println!("`Counter::clone` called {} times", n.get());
}
`Counter::clone` called 3 times
`Counter::clone` called 0 times
Берегите себя и не пишите, пожалуйста, в Clone::clone
что-то помимо собственно клонирования.doc.rust-lang.org
Copy in std::marker - Rust
Types whose values can be duplicated simply by copying bits.
Forwarded from Linker Unsafe
Довольно увлекательная статья о том, как человек участвовал в RAIC 2020. В этот раз необходимо было запрограммировать бота для игры в сильно упрощённый Старкрафт.
Человек решил офигенное количество с виду простых задач по разруливанию поведения юнитов на поле. И когда казалось, что все возможные грабли учтены, оказывалось, что находилась ещё ситуация (и не одна!), когда алгоритм действовал не лучшим образом.
Например,
Еще одной важной проблемой, которая не давала покоя было то, что когда мои лучники и лучники противника сближались, и становились стенка против стенки, то новые лучники подходили сзади и подпирали их. Таким образом они были абсолютно неэффективны, т.к. просто стояли и ничего не делали. И так могло накопиться много слоев моих лучников. Это выглядело как явная тактическая ошибка.
В-общем, стоящая статья, я получил удовольствие от прочтения. Краткий вывод:
1. Для участия в RAIC 2021 нужно уволиться с работы или взять отпуск месяца на 2 😊
2. Большинство задач тривиальны, но обобщённое и эффективное решение части из них позволяет разом убить 100 "зайцев" и избавиться от костылей в будущем.
3. Для участия не нужно иметь опыт в AI, ML, DL и других аббревиатурах, нужно просто уметь писать if-ы и циклы😉, но желательно уметь дебажить и профилировать код.
https://m.habr.com/ru/post/535310/
Человек решил офигенное количество с виду простых задач по разруливанию поведения юнитов на поле. И когда казалось, что все возможные грабли учтены, оказывалось, что находилась ещё ситуация (и не одна!), когда алгоритм действовал не лучшим образом.
Например,
Еще одной важной проблемой, которая не давала покоя было то, что когда мои лучники и лучники противника сближались, и становились стенка против стенки, то новые лучники подходили сзади и подпирали их. Таким образом они были абсолютно неэффективны, т.к. просто стояли и ничего не делали. И так могло накопиться много слоев моих лучников. Это выглядело как явная тактическая ошибка.
В-общем, стоящая статья, я получил удовольствие от прочтения. Краткий вывод:
1. Для участия в RAIC 2021 нужно уволиться с работы или взять отпуск месяца на 2 😊
2. Большинство задач тривиальны, но обобщённое и эффективное решение части из них позволяет разом убить 100 "зайцев" и избавиться от костылей в будущем.
3. Для участия не нужно иметь опыт в AI, ML, DL и других аббревиатурах, нужно просто уметь писать if-ы и циклы😉, но желательно уметь дебажить и профилировать код.
https://m.habr.com/ru/post/535310/
Хабр
История 4го места на Russian AI Cup 2020
В этом году поучаствовал в соревновании по написанию игровых ботов Russian AI Cup. И хоть не удалось взять 1е место, как в 2017, но все равно это было увлекательное и невероятно азартное...
Forwarded from Врен о Японии для туриста
Районный суд в Питере взял и запретил аниме Death Note и Inuyashiki. Правда, не везде запретил, а только на одном пиратском сайте. И не потому что он пиратский, а потому что слово "смерть" в названии Death Note провоцирует на суицид, а в Inuyashiki эксперты запутались в полах персонажей.
Уровень абсурда невероятен, конечно, но и последствий у этого решения никаких. Просто еще один обычный день России, сценарий для которого был словно написан в редакции ИА Панорама.
Уровень абсурда невероятен, конечно, но и последствий у этого решения никаких. Просто еще один обычный день России, сценарий для которого был словно написан в редакции ИА Панорама.
Forwarded from Шикимори
Колпинский районный суд Петербурга запретил распространение страницы сайта yummyanime с аниме «Токийский гуль» из-за неуказанных возрастных ограничений.
Комментарий эксперта от прокуратуры, доктора психологических наук, Василия Георгиевича Белова с высшим педагогическим образованием и стажем работы более 30 лет, работающего в Санкт-Петербургском институте независимой экспертизы и оценки: «В данном сериале практически формируется установка на садистические наклонности. Из такого человека легко вырастет садист. Надо понимать, что у нас очень много скрытой психопатологии. Такие фильмы выполняют роль выпускания джина из бутылки. То есть ты джина легко выпустишь, но обратно его загнать не получится никакими способами. Посмотрев такие фильмы, формируются соответствующие группы подростков, в которых такое поведение легко воспроизводится. Это недопустимо, потому что фактически идет массовая манипуляция сознания подростков и детей. Вот личностные расстройства легко культивируются, вот он садист будущий! Прямо побуждается к тем действиям, что демонстрируется на экране. Это максимально разрушительный потенциал и недопустимо демонстрировать в открытом доступе»
Судья в свою очередь упоминает «огромное количество писем», в том числе из Владикавказа, Белгорода, Великого Новгорода — в которых россияне требуют «закрыть эти ссылки, ведь они калечат души детей».
📰#заметки ※ #Tokyo_Ghoul
Комментарий эксперта от прокуратуры, доктора психологических наук, Василия Георгиевича Белова с высшим педагогическим образованием и стажем работы более 30 лет, работающего в Санкт-Петербургском институте независимой экспертизы и оценки: «В данном сериале практически формируется установка на садистические наклонности. Из такого человека легко вырастет садист. Надо понимать, что у нас очень много скрытой психопатологии. Такие фильмы выполняют роль выпускания джина из бутылки. То есть ты джина легко выпустишь, но обратно его загнать не получится никакими способами. Посмотрев такие фильмы, формируются соответствующие группы подростков, в которых такое поведение легко воспроизводится. Это недопустимо, потому что фактически идет массовая манипуляция сознания подростков и детей. Вот личностные расстройства легко культивируются, вот он садист будущий! Прямо побуждается к тем действиям, что демонстрируется на экране. Это максимально разрушительный потенциал и недопустимо демонстрировать в открытом доступе»
Судья в свою очередь упоминает «огромное количество писем», в том числе из Владикавказа, Белгорода, Великого Новгорода — в которых россияне требуют «закрыть эти ссылки, ведь они калечат души детей».
📰#заметки ※ #Tokyo_Ghoul
#prog
Если вы по каким-то причинам используете свой пароль в командной строке для доступа к GitHub (как это делаю я), то имейте в виду, что, начиная с 13 августа, пароли больше не будут работать. Мотивируют соображениями безопасности и предлагают в качестве альтернативы personal access token-ы, которые... Работают на практике так же, как пароли, но с настраиваемым доступом и всякими секьюрити-плюшками. Включая тот факт, что этот токен можно посмотреть лишь раз после создания, а после этого его уже не получиться посмотреть.
Спасибо за заботу, но нет, для меня неудобно и выглядит как сраный вендор-лок.
Если вы по каким-то причинам используете свой пароль в командной строке для доступа к GitHub (как это делаю я), то имейте в виду, что, начиная с 13 августа, пароли больше не будут работать. Мотивируют соображениями безопасности и предлагают в качестве альтернативы personal access token-ы, которые... Работают на практике так же, как пароли, но с настраиваемым доступом и всякими секьюрити-плюшками. Включая тот факт, что этот токен можно посмотреть лишь раз после создания, а после этого его уже не получиться посмотреть.
Спасибо за заботу, но нет, для меня неудобно и выглядит как сраный вендор-лок.
The GitHub Blog
Token authentication requirements for Git operations
Beginning August 13th, 2021, we will no longer accept account passwords when authenticating Git operations on GitHub.com.
#prog #rust #rustlib #amazingopensource
(на самом деле не такой уж amazing, я этот кодес изнутри видел)
(на самом деле не такой уж amazing, я этот кодес изнутри видел)
Forwarded from rusta::mann
Иногда при написании документации не хватает визуальной составляющей, особенно когда нужно описать высокоуровневые взаимодействия компонентов системы, и прочие штуки, которые тяжело воспринимать без диаграммок.
На радостькрудошлепам любителям повизуализировать, я сделяль интеграцию mermaid.js в растовые док-комменты, чтобы можно было вообще из docs.rs не вылезать.
Пример как это выглядит в коде:
Ссылки:
crates.io
docs.rs
github
пост на r/rust (буду благодарен апвоуту :p)
#сделяль
На радость
Пример как это выглядит в коде:
#[aquamarine]
/// mermaid
/// graph LR
/// s([Source]) --> a[[aquamarine]]
/// r[[rustdoc]] --> f([Docs w/ Mermaid!])
/// subgraph rustc[Rust Compiler]
/// a -. inject mermaid.js .-> r
/// end
///
pub fn example() {}
Ссылки:
crates.io
docs.rs
github
пост на r/rust (буду благодарен апвоуту :p)
#сделяль
docs.rs
aquamarine - Rust
Aquamarine is a procedural macro extension for rustdoc, that aims to improve the visual component of Rust documentation through use of the mermaid.js diagrams.
#prog #cpp
Короткий код на C++, который выдаёт разные результаты, если его скомпилировать GCC, Clang, MSVC и ICC. Спасибо @oleg_log, наверное
Короткий код на C++, который выдаёт разные результаты, если его скомпилировать GCC, Clang, MSVC и ICC. Спасибо @oleg_log, наверное
Arthur O’Dwyer
Fun with conversion-operator name lookup
As of this writing (but perhaps not for very much longer!) the four mainstream compilers
on Godbolt Compiler Explorer give four different answers for
this simple C++ program:
on Godbolt Compiler Explorer give four different answers for
this simple C++ program:
Forwarded from A Certain Scientific Impostor
Хотите шутку? Это Путин.
А знаете почему?
После возведения в четвертую степень она обнулится.
ПС. Кстати зацените какой латексный бот классный.
А знаете почему?
После возведения в четвертую степень она обнулится.
ПС. Кстати зацените какой латексный бот классный.
#prog #cpp #article
Если написать в коде
Если написать в коде
using namespace foo;
, это добавит в текущую область видимости все элементы из пространства имён foo
, верно? Лол, нет.Arthur O’Dwyer
How do C++ using-directives work?
Recall that in C++ there’s a difference between a using-declaration
and a using-directive.
and a using-directive.
#prog #rust #rustlib #amazingopensource #video
nannou — фреймворк на Rust для создания графических (и не только) инсталляций. Берёт на себя всю работу, связанную с отрисовкой и инициализацией, оставляя программисту непосредственно интересную креативную часть.
Видео с live code демонстрацией nannou в действии.
nannou — фреймворк на Rust для создания графических (и не только) инсталляций. Берёт на себя всю работу, связанную с отрисовкой и инициализацией, оставляя программисту непосредственно интересную креативную часть.
Видео с live code демонстрацией nannou в действии.
nannou.cc
Home
An open-source creative-coding framework for Rust
Forwarded from Так говорит Алиса (John Meow)
Люди: используют табы
Люди: используют 4 пробела
Люди: используют 2 пробела
Люди: используют 8 пробелов
Какой-то извращенец: центрирует код
#prog #reddit #programminghorror #unseejuice
Люди: используют 4 пробела
Люди: используют 2 пробела
Люди: используют 8 пробелов
Какой-то извращенец: центрирует код
#prog #reddit #programminghorror #unseejuice
reddit
This website center-aligned their code
Posted in r/programminghorror by u/lajji69 • 4,499 points and 118 comments