1.83K subscribers
3.3K photos
132 videos
15 files
3.58K links
Блог со звёздочкой.

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

Небольшое прикольное комьюнити: @decltype_chat_ptr_t
Автор: @insert_reference_here
Download Telegram
#prog #rust #rustreleasenotes

Вышла новая версия Rust 1.61.0! Как всегда, я ограничусь только интересным мне, за остальным смотрите полные записи о релизе.

▪️Заметно расширены возможности const fn. Теперь в них можно, загибайте пальцы:

* создавать, передавать и кастовать fn-указатели, а также трейт-объекты;
* принимать и возвращать impl Trait;
* иметь ограничения в виде трейтов на типы в обобщённых const fn.

При всём этом вызывать методы трейтов всё ещё нельзя. Тем не менее, даже это весьма полезно, ибо в const fn теперь можно использовать ассоциированные типы и константы. В частности, в моём коде к статье "Как написать Fizzbuzz на собеседовании" (кстати, если вы её вдруг ещё не прочитали — рекомендую) теперь можно написать так:

const fn to_str_by_type<T: NumericValue, const N: usize>() -> Str<{ N }> {
to_str(T::VALUE)
}

И, соответственно, реализацию AsStr написать немного иначе:

impl<T, const N: usize> AsStr<{ N }> for T
where
T: NumericValue,
{
const VALUE: Str<{ N }> = to_str_by_type::<Self, { N }>();
}

(опустить значение константы, к сожалению, нельзя). Разумеется, с подобным инструментарием можно сделать и что-то более интересное, но более интересных примеров у меня нету.

А, и ещё целую пачку методов на сырых указателях теперь можно применить и в const-контексте.

▪️Функция с impl Trait в возвращаемом типе теперь может быть рекурсивной, и внутри неё возвращаемый тип не будет непрозрачным (на самом деле это скорее побочный эффект сложного изменения, смотри PR)

▪️С версии Rust 1.26.0 main может возвращать также Result<(), E: Debug>, при этом на ошибке она выводилась в stderr при помощи форматирования Debug, и это поведение не подлежало кастомизации. Теперь же его можно настроить при помощи реализации трейта Termination для некоего своего типа — main теперь должен возвращать значение некоторого типа, реализующего этот трейт.

▪️{Stdin, Stdout, Stderr}::lock теперь возвращают соответствующие guard-ы, параметризованные не временем жизни ссылки на self, а 'static. Это безопасно, поскольку значения этих типов являются доступом к глобальным ресурсам. Данное изменение наконец позволяет писать просто:

let mut stdin = std::io::stdin().lock();

вместо

let stdin = std::io::stdin();
let mut stdin = stdin.lock();

▪️Вы когда-нибудь хотели удалить из вектора все элементы, удовлетворяющие некоторому предикату, но при этом модифицировать оставшиеся? Новодобавленные Vec::retain_mut (а также VecDeque::retain_mut) к вашим услугам.

▪️ManuallyDrop<T> всегда должен был иметь такое же представление в памяти, как и T. Теперь это прописали явно в документации.

▪️Наконец-то пофиксили более чем годовой старости баг с недостаточными проверками ограничений на ассоциированные типы в трейт-объектах, который позволял сделать свой transmute в safe коде.

▪️Предикаты для all и any внутри cfg теперь всегда вычисляются полностью, а не лениво. Это позволяет раньше ловить ошибки с ошибочной условной компиляцией.

▪️Число хешей для ограничений сырых строковых литералов снизили с щедрых 65535 (u16::MAX) до абсолютно зверских 255. Кошмар! </sarcasm>

На этом всё, всё остальное по ссылке.
👍7🔥1
👏26🤬61👍1😁1
Кресты на моей кукухе
Photo
На LinkedIn, кстати, та же фигня. Ещё и Ruby зачем-то подсовывает
#prog #rust #article

Rust: A Critical Retrospective

Still, after spending a couple years in the foxhole with Rust and reading countless glowing articles about the language, I felt like maybe a post that shared some critical perspectives about the language would be a refreshing change of pace.
5👍1
Forwarded from Life of Tau
программирование на расте - боль
программирование на крестах - страдания
я мазохистка и предпочитаю боль
👎5👍3
Forwarded from Doge Shibu
👍25
Скажите, а к чему снится обстрел из пулемёта гражданских в городе с вертолёта? Причём с точки зрения одного из гражданских
🤔11😁5😱3😢32
Forwarded from Life of Tau
любишь кататься [в автозаке] - люби и на улицу выходить
- @existingone

#quote
🥰3🤮3😢1
#prog #go #article

Changing one character wildly improved our application's performance

(thanks @go_perf)

TL;DR:

type uint128 = struct {
hi uint64
lo uint64
}

func less128(a, b uint128) bool {
- return a.hi < b.hi || (a.hi == b.hi && a.lo <= b.lo)
+ return a.hi < b.hi || (a.hi == b.hi && a.lo < b.lo)
}

Из-за внесённой ошибки некоторые элементы ошибочно считались равными, из-за чего сортировка делала лишние перестановки в массиве. И вот тут я опять хочу привести в пример Rust как язык, в котором данную ошибку допустить гораздо сложнее: вместо того, чтобы вручную писать сравнение, проще добавить к определению #[derive(Ord)] (ладно, #[derive(PartialEq, Eq, PartialOrd, Ord)], но это всё равно меньше, чем писать руками).

И да, неожиданно, но даже C++ в этом плане лучше (правда, лишь начиная со стандарта C++20). В нём можно заставить компилятор сгенерировать все функции сравнения, чтобы не писать их руками:

#include <cstdint>
#include <compare>

struct uint128 {
uint64_t hi;
uint64_t lo;

std::strong_ordering operator<=>(const uint128&) const & = default;
};
😁4👍1
#prog #rust #cpp #article

Can you have too many programming language features?

Bjarne Stroustrup famously said, “Within C++, there is a much smaller and cleaner language struggling to get out.” I think he regrets the quote, which he clarified is about the modern semantics of C++, held down by the outdated syntax of C. It’s such a compelling quote, though, because C++ is so messy and dirty, so we want to believe in a small clean underlying core.

The truth, however, is that there isn’t one smaller and cleaner programming language struggling to get out. There’s multiple. And from the beginning, C++ was a glomming-together of multiple ideas: a Simula-like OOP system glued awkwardly to C, without a unified motivating vision. Operator overloading was intended to help integrate the two parts, which it did but at the expense of creating its own entire sub-paradigm. And then came templates, which tried to add generic containers and algorithms but unexpectedly exploded into their own programming paradigm.

So inside C++, struggling to get out, is of course C, the original “portable assembly,” which does its very simple job well. There’s also Java/C# in there, if we take the OOP features on their own. For the operator overloading and RAII and templates, the closest I can really imagine is Rust, which I think if Bjarne was being fair, he would have to admit is close to what he specified when he clarified his quote: Rust does emphasize “programming styles, libraries and programming environments that emphasized the cleaner and more effective practices over archaic uses focused on the low-level aspects of C.”
👍1
😁171
Так раздражает, когда люди, которые не пользуются на постоянной основе растом критикуют его.

Не потому что раст идеален. Но потому что они критикуют его не за то. Они не знают настоящих проблем раста.
3💩1
Блог* pinned «#soc #article People don't work as much as you think (thanks @GabrielFallen)»
Блог* pinned «#prog #rust #моё Не могу пройти мимо и удержаться от похвал Rust. Однако перед этим всё же проведу небольшой эксперимент по поводу производительности алгоритмов в стандартной библиотеке Rust. Проверять будем при помощи такого кода: use rand::prelude::*;…»
Мета-#meme, всё, как я люблю
Forwarded from ОРУ, СЭР!
13😁6💩1
Каналы, которые не дают возможности поставить дизлайк, выглядят так жалко
👍41👎145💩4🤮2❤‍🔥1🤔1👌1🤣1