All streams
Search
Write a publication
Pull to refresh
76
0
Андрей Лесников @ozkriff

Rust сектант и хобби-игродел

Send message
> Как видим мы можем брать адрес константы и с его помощью её использовать, но думаю лучше так не делать, т.к. «ссылки на одну и ту же постоянную не обязаны указывать на один и тот же адрес в памяти»

Многие функции одалживают значения, почему бы не передавать туда константы? Пускай себе в ссылки в разные места на стеке будут, я тут плохого не вижу.
А можно немного развернуть мысль? А то я как-то вообще в этом `use num::number[i]` смысла не вижу)
> use num::number::one; // Пишем one без скобочек.
> Но так делать не рекомендуется, т.к. может возникнуть конфликт имён.

Не припомню таких официальных рекомендаций. Вот что делать `use foo::*;` в большинстве ситуаций не стоит — это да)
Удалить и поставить заново. Но какие-то планы на нормальный способ, вроде, есть — https://github.com/rust-lang/cargo/issues/2082
> Всё её прелесть в возможности установить внешние плагины на ваш cargo.

Не только плагины же, а любые приложения с crates.io (где в cargo.toml есть bin-секция).
«ценой дополнительной нагрузки на программиста» — очень спорная формулировка :). Я бы скорее говорил в направлении перенеса какой-то части нагрузки на программиста со стадии отладки на стадию написания кода.
Не, ну до метатаблиц тут очень далеко. Просто щепотка удобства.
Реализацию IndexMut специально убрали когда-то, как раз в ожидании IndexAssign:

https://github.com/rust-lang/rust/pull/23559

This commit removes the IndexMut impls on HashMap and BTreeMap, in order to future-proof the API against the eventual inclusion of an IndexSet trait.

Ideally, we would eventually be able to support:

map[owned_key] = val;
map[borrowed_key].mutating_method(arguments);
&mut map[borrowed_key];


but to keep the design space as unconstrained as possible, we do not currently want to support IndexMut, in case some other strategy will eventually be needed.

Code currently using mutating index notation can use get_mut instead.
Это не для индексов же. Я хочу возможность нормально писать `&mut map[key]` (по аналогии со сто лет как работающим `&map[key]`), а не `map.get_mut(key).expect(«TODO: добавить обработку ошибок по вкусу»)`. :(
Надеюсь, хоть IndexAssign (https://github.com/rust-lang/rust/pull/25628) скоро одобрят, а то с хештаблицами сейчас работать не слишком удобно.
Как это Серво связан с Хромом? )
Может, через какое-то время эта оптимизация все-таки станет менее актуальной — https://github.com/rust-lang/rust/pull/30652
Читать доки это одно, а самому задать сложный вопрос, и уж тем более обсудить чего-то в чате — совсем другое.

Да и большой объем информации (как rustbook) многим проще на русском осилить, даже если они вполне терпимо читают на английском.
В ржавчине переборщили с сахаром? О.о Обычно на обратное ругаются, что «очевидные компилятору вещи» нужно явно выписывать и «синтаксической соли» (типа `let mut`) слишком много)

А что именно мешает воспринимать код? Мне в голову в первую очередь локальный вывод типов приходит, но он во все языки сейчас потихоньку просачивается, вроде как уже норма (`auto auto(auto) auto` :) ).
В общем-то да, примерно то же самое.
> А как код выглядел бы с do-нотацией?

Сейчас есть накостыленый на макросах mdo! — https://github.com/TeXitoi/rust-mdo — лучше без HTK особо не сделаешь. С ним как-то так выходит:

fn write_to_file_using_try() -> io::Result<()> {
    let mut file = try!(File::create("my_best_friends.txt"));
    try!(file.write_all(b"This is a list of my best friends."));
    println!("I wrote to the file");
    Ok(())
}

fn write_to_file_using_mdo() -> io::Result<()> {
    mdo! {
        mut file =<< File::create("my_best_friends.txt");
        ign file.write_all(b"This is a list of my best friends.");
        ign Ok(println!("I wrote to the file"));
        ret Ok(())
    }
}


Если интегрировать в язык, то, наверное, можно и немного покороче/покрасивей синтаксис придумать.

> Не получится ли слишком громоздко?

Может, от конкретного кода зависит. Функции, возвращающие чего-то левое (как println! в примере), которые не выходит вынести за рамки do, конечно, придется «втягивать».

Если что, я на знатока функциональных буррито не претендую, но идея кажется заслуживающей проработки)
> В Си эта проблема решалась значениями-исключениями

И это печально.
Ну как, я относительно давно на ржавчине пытаюсь писать, так что дело не просто в непривычности.

С одной стороны, я считаю что хороший макрос являет собой цельную абстракцию, действие которой не выходит за скобки вызова, вроде как и в официальных доках чего-то такое было. А тут она берет и влияет на код вокруг.

С другой, к макросам я отношусь как к средству, к которому прибегают когда у самого языка не хватает выразительности, а тут у нас оочень частая операция. Тоже странно.

Повторюсь, каких-то жутких практических недостатков в данном конкретном случае я не вижу — согласен с Михаилом, что ситуацию спасает одиночество `try!`. Но мне было бы комфортнее, если бы вышеуказанный RFC довели до ума и реализовали, пускай оно даже один в один как `try!` работало бы. Или даже что бы таки реализовали HKT и ввели в язык do-нотацию :).
На данный момент, если не ошибаюсь, паникует только в отладочной сборке. Это может быть важно)
Таки-меня коробит, что для такой важной и распространенной вещи как обработка ошибок по всему коду используется макрос, который еще и меняет поток выполнения. Не то что бы я видел в этом какой-то вот прямо практический вред, нооо как-то криво это. Ожидаю рано или поздно какого-то обобщенного решения интегрированного в сам язык, вроде же были какие-то rfc.

Information

Rating
Does not participate
Location
Санкт-Петербург, Санкт-Петербург и область, Россия
Registered
Activity