Автор ZeroMQ сейчас занимается разработкой nanomsg, которая, как я понимаю, есть «ZeroMQ done right». Вот здесь рассказывается об отличиях nanomsg и ZeroMQ.
Общее мнение насчёт abstract return types — они нужны, но пока можно потерпеть. Соответствующий RFC был закрыт с комментарием, что он нуждается в переработке. Скорее всего, после 1.0 к нему вернутся.
Такая возможность существует в виде методов на Result и Option. Кроме того, в коммьюнити языка одна из наиболее желаемых фич — это higher-kinded types, которые открывают дорогу, в том числе, к обобщённым монадам и обобщённым операторам для работы с ними, наподобие do-нотации хаскелля или for comprehensions скалы. К сожалению, в 1.0 этого не будет просто по причине нехватки времени.
Извините, совершенно непонятно, почему подобная новость заслуживает отдельной статьи. В Rust есть исключения в смысле stack unwinding — это макрос panic!(). Да, такие «исключения» нельзя ловить, но это трудно сделать кроссплатформенно и чревато небезопасностью работы с памятью, поэтому в Rust так делать нельзя.
RFC по вашей ссылке — это предложение добавить в язык удобный способ пропагации ошибок, похожий на исключения, но не несущий их проблем, потому что этот способ всегда можно переписать через match/return. Фактически, это синтаксический сахар. Он не подразумевает какое-то разворачивание стека и обработку, ничего того, чего нельзя сделать прямо сейчас.
Ну и если на то пошло, то этот конкретный RFC всего лишь отложили до после 1.0, потому что к 1.0 его просто не успели бы реализовать достаточно качественно. Как тут уже сказали, 1.0 — это не конец развития, а только его начало.
Да ладно, та клавиатура ещё ничего. В X230 такая, и с ней более-менее нормально (хотя тачпад весьма уныл, да). А вот то, что у самых современных моделей вроде нового Carbon…
Обожаю свой X230, и хотелось бы что-то подобное купить и в будущем, когда придёт пора обновляться, но очень спорные решения по дизайну клавиатуры Lenovo уже сейчас заставляют тревожиться :( первый звонок был когда с клавиатур новых моделей вроде X240 пропала кнопка Insert. Но вышеприведённая Pono ссылка — это что-то вообще за гранью добра и зла. У меня по Caps Lock переключение раскладки, и что мне с этим пришлось бы делать на Carbon?
Не совсем корректно, имхо, называть трейты классами типов, потому что они всё-таки немного отличаются от функциональности классов типов из хаскеля. Хотя со временем различия размываются, да — скоро в трейты добавят (если уже не добавили, не помню) множественную диспетчеризацию и ассоциированные типы. В Rust очень сильно не хватает типов высшего порядка, поэтому многие вещи, нормальные для классов типов, через трейты невыразимы.
Трюк с None, к счастью, временный — с добавлением UFCS (хотя я не уверен, что его добавят до 1.0) нужда в нём отпадёт. Кстати, емнип, это
let n: Option<T> = None;
Float::mantissa_digits(n)
благодаря lifetime elision :) как видите, от аннотаций почти ничего не осталось. Видимо, автор redis-rs не успел обновить код или проглядел этот кусок.
Обилие to_string() с большой долей вероятности свидетельствует о неидиоматичной для Rust архитектуре.
Обилие as_slice() — это известная проблема, но с недавнего времени вместо x.as_slice() можно писать x[]. А если as_slice() используется для вызова метода: x.as_slice().some_method(), то есть очень хорошие шансы, что в скором времени as_slice() не потребуется ни в каком виде: x.some_method().
Неа, именно ровно столько же. Возьмите функцию y=arctg x. Это биекция между R и (-pi/2, pi/2), следовательно, отрезок и прямая равномощны, в том числе, в смысле «любой точке отрезка соответствует некоторая точка прямой, и наоборот».
Вот правильная: doc.rust-lang.org/std/finally/
Не основной, а последний. В Rust нет основных тасков как в Go, все треды равноправны.
Result
иOption
. Кроме того, в коммьюнити языка одна из наиболее желаемых фич — это higher-kinded types, которые открывают дорогу, в том числе, к обобщённым монадам и обобщённым операторам для работы с ними, наподобие do-нотации хаскелля или for comprehensions скалы. К сожалению, в 1.0 этого не будет просто по причине нехватки времени.and_then()
:panic!()
. Да, такие «исключения» нельзя ловить, но это трудно сделать кроссплатформенно и чревато небезопасностью работы с памятью, поэтому в Rust так делать нельзя.RFC по вашей ссылке — это предложение добавить в язык удобный способ пропагации ошибок, похожий на исключения, но не несущий их проблем, потому что этот способ всегда можно переписать через match/return. Фактически, это синтаксический сахар. Он не подразумевает какое-то разворачивание стека и обработку, ничего того, чего нельзя сделать прямо сейчас.
Ну и если на то пошло, то этот конкретный RFC всего лишь отложили до после 1.0, потому что к 1.0 его просто не успели бы реализовать достаточно качественно. Как тут уже сказали, 1.0 — это не конец развития, а только его начало.
строго говоря, это стандартный функционал гита.
git rebase --abort
в середине процесса вернёт репозиторий в состояние до ребейза, например.Не совсем корректно, имхо, называть трейты классами типов, потому что они всё-таки немного отличаются от функциональности классов типов из хаскеля. Хотя со временем различия размываются, да — скоро в трейты добавят (если уже не добавили, не помню) множественную диспетчеризацию и ассоциированные типы. В Rust очень сильно не хватает типов высшего порядка, поэтому многие вещи, нормальные для классов типов, через трейты невыразимы.
Трюк с None, к счастью, временный — с добавлением UFCS (хотя я не уверен, что его добавят до 1.0) нужда в нём отпадёт. Кстати, емнип, это
можно переписать как
эквивалентно этому:
благодаря lifetime elision :) как видите, от аннотаций почти ничего не осталось. Видимо, автор redis-rs не успел обновить код или проглядел этот кусок.
to_string()
с большой долей вероятности свидетельствует о неидиоматичной для Rust архитектуре.Обилие
as_slice()
— это известная проблема, но с недавнего времени вместоx.as_slice()
можно писатьx[]
. А еслиas_slice()
используется для вызова метода:x.as_slice().some_method()
, то есть очень хорошие шансы, что в скором времениas_slice()
не потребуется ни в каком виде:x.some_method()
.