• Как автоматически реализовать некие методы для всех типов, реализующих некий трейт?

    1. Можно создать новый трейт, который будет расширять стандартный:
    use std::io::Read;
    
    trait ReadOneByte: Read {
        fn read_one_byte(&mut self) -> Option<u8>;
    }
    
    impl<T: Read> ReadOneByte for T {
        fn read_one_byte(&mut self) -> Option<u8> {
            let mut buf = [0u8];
            match self.read(&mut buf) {
                Ok(count) if count == 1 => Some(buf[0]),
                _ => None,
            }
        }
    }


    2. А вообще-то лучше использовать обычные функции:
    fn read_one_byte<T: Read>(source: &mut T) -> Option<u8> {
        let mut buf = [0u8];
        match self.read(&mut buf) {
            Ok(count) if count == 1 => Some(buf[0]),
            _ => None,
        }
    }
    Ответ написан
    8 комментариев
  • Странный дизайн Rust?

    @DoumanAsh
    >Во первых, почему указатели в Rust называются ссылками?
    Во первых референс это не указатель.
    Указатели это *const _ и *mut _
    То что референсы имеют разыменование не делает их указателями, да и пользоваться этим не надо обычно.

    Такой вопрос уже задавался если тебе интересно почитай https://users.rust-lang.org/t/solved-why-do-refere...

    Во вторых ты можешь почитать о референсах
    https://doc.rust-lang.org/1.10.0/book/references-a...
    https://doc.rust-lang.org/1.4.0/nomicon/references.html
    Ответ написан
    Комментировать
  • Что нужно для создания GUI библиотеки?

    TrueBers
    @TrueBers
    Гуглю за еду
    У вас существует недопонимание конвеера отрисовки/композитинга/серверов графических элементов. "opengl/vulkan" и "xlib" это совершенно разные уровни абстракции интерфейса. Они часто работают вместе и дополняют друг друга. Можно работать с контроллами через xlib и при этом рисовать это всё через OpenGL.

    Вообще, с системами отрисовки графических элементов, различными уровнями абстракций сейчас такой дичайший зоопарк творится, даже сами разработчики порой уже путают эти уровни, впихивают невпихуемое туда, где его быть не должно, потом переписывают всё с нуля, старые костыли оставляют для совместимости, и т. д. Поэтому, крайне не советую начинать это неблагодарное дело, ибо не закончите никогда. Возьмитесь лучше за что-то попроще, напишите биндинги для GTK или Qt, например, если уж так нравятся гуи.
    Ответ написан
    Комментировать
  • Как указать путь racer для vs code?

    Удобнее всего раст устанавливать через rustup (https://www.rustup.rs). Он установит и rust и cargo, и обновлять их будет (по команде "rustup update", https://github.com/rust-lang-nursery/rustup.rs). Прописываем в PATH путь в cargo/bin, хотя rustup и сам может прописать.

    Что касается VSCode, то надо установить расширение Rusty Code.

    Далее, устанавливаем racer (для автокомплита), rustfmt (форматирует код при сохранении файла, https://github.com/rust-lang-nursery/rustfmt), rustsym (для go to sym, https://github.com/trixnz/rustsym), cargo-check (при сохранении файла будет компилировать его на лету и выдапвать в консоли VSCode сообщения об ошибках, https://github.com/rsolomo/cargo-check). Лучше устанавливать через команду "cargo install", так удобнее.
    Т.е. в консоли просто выполняем команды:

    cargo install rustfmt
    cargo install racer
    cargo install rustsym
    cargo install cargo-check

    Это все установится в каталог cargo/bin, куда у нас уже прописан путь в PATH и потому VSCode их легко найдет.

    Я еще устанавливаю cargo install cargo-edit (https://github.com/killercup/cargo-edit), тогда крейты в Cargo.toml для своих проектов можно не вручную прописывать (doc.crates.io/guide.html), а командой "cargo add".

    Для racer нужно установить переменную среды окружения RUST_SRC_PATH, указав путь к скачанным отдельно и распакованным исходникам rust (подкаталогу src).

    PS: Ошибки у вас выдаются из-за того, что cargo install пытается установить программы, а бинариники уже по указанным путям лежат. Нужно просто вручную их удалить, или вызвать соответствующие команды "cargo install --force ..." для обновления бинарников.
    Ответ написан
    Комментировать
  • Как подключать внешние файлы в Rust?

    Через карго подключаются внешние библиотеки — крейты. А вам, видимо, нужны модули. Для этого файлы должны следовать стандартной иерархии. Например, так:
    В каталоге src два файла: main.rs и foo.rs

    --- main.rs ---
    mod foo;
    use foo::*;
    fn main() {
    boo();
    }

    --- foo.rs ---
    pub fn boo() {
    println!("boo()");
    }

    Если нужны подмодули, тогда вместо foo.rs создаем каталог foo, в нем кладем mod.rs, в котором уже лежит код модуля foo, а заодно объявляются необходимые подмодули ( Как получить доступ к одному файлу из другого в Rust? ).
    Подробности можно найти тут: https://doc.rust-lang.org/book/crates-and-modules.html
    Ответ написан
    Комментировать
  • Странный дизайн Rust?

    Rust это не C++. Почему он должен брать термины из C++?

    В Java вон тоже ссылки - это указатели в терминологии C++.

    Более того, ссылка от указателя отличается лишь абстракцией. В памяти это будут одинаковые ячейки, содержащие адрес.
    Ответ написан
    Комментировать
  • Go vs Rust для realtime бэкэнда игры (20 запросов в секунду с каждого клиента)?

    sim3x
    @sim3x
    Скорее раст
    Но у тебя проблема не с рпс, а работа с предсказаниями
    Те как бы часто ты не рассылал текущее сотояние на сервере, ты будешь опаздывать на один- два пинга пользователя. Что для шутера не приемлемо
    Ответ написан
    Комментировать
  • Учебный материал по работе с памятью?

    Rou1997
    @Rou1997
    Начните сперва с C++ как с более распространенного языка.

    Как следить за ней

    Чтобы работало, и утечек памяти не было, то есть более не нужные данные не занимали память.

    как правильно работать с указателями/ссылками

    Очищать всю динамически выделенную память, когда уже не нужна, грубо говоря, на каждый new должен быть delete, если только приложение не завершается сразу же, тогда вся память очищается..

    Всегда писал на языках, использующих сборщик мусора. Естественно никогда не парился по поводу работы с памятью.

    В них тоже бывают утечки памяти, но это частные случаи, например, при многопоточности.
    Ответ написан
    Комментировать
  • Имеет ли смысл переводить документацию Rust?

    OLDRihard
    @OLDRihard
    Java Developer
    Вы какую именно документацию имеете ввиду? Если Rustbook, то вы опоздали. Проще уж подсобите сообществу с переводом других книг.
    Ответ написан
    Комментировать