Ответы пользователя по тегу Rust
  • Какие задачи решают на Rust, а какие на Golang?

    bingo347
    @bingo347
    Crazy on performance...
    Какие задачи решают на Rust
    любые. Rust - язык общего назначения, применимый к большинству возможных задач. Rust достаточно высокоуровневый для написания на нем прикладного ПО и компилируется в достаточно эффективный машинный код, для применения в ядрах ОС, драйверах или embedded разработке. Так же Rust на сегодня имеет самый маленький размер при компиляции в wasm, что критично для использования в web. Я честно не знаю такой сферы, к которой бы не подошел Rust.
    Единственной проблемой в применимости Rust я вижу недостаточную его распиаренность в РФ, что часто бывает самым важным критерием для "манагеров" и прочих людей принимающих решения о используемом стеке.
    а какие на Golang
    Golang тоже язык общего назначения, но имеющий ряд ограничений:
    - Крайне тяжелый рантайм не дает возможность использовать его в wasm, embedded или компонентах ядра.
    - Необходимость в сборке мусора опять таки ограничивает разработку для embedded или компонентов ядра.
    - Отказ от llvm в качестве бэкенда компилятора ограничивает число целевых платформ.
    Можно один заменить другим?
    Rust спокойно заменяет Golang в любой возможной на последнем задаче, наоборот же иногда имеем ряд ограничений.

    Вместо P.S.:
    Golang скорее всего окажется более быстрым для прототипирования и быстрого старта. Однако отсутствие полиморфизма в любом виде (утиная типизация не в счет) и ограниченность одной парадигмой структурного программирования делает этот язык крайне дорогим в поддержке. Так же этому (и быстрому прототипированию и дорогой поддержке кода) способствует лютая ненависть создателей языка к принципу DRY.
    Rust имеет такую редкую сегодня строгую типизацию, одним из нюансов которой являются концепции владения и заимствования (которые позволяют делать автоматическое управление памятью в compile time), что порождает с одной стороны высокий порог входа в технологию (что сглаживается человекопонятным выводом компилятора, если входящие умеют читать, что еще более редко встречается сегодня, чем строгая типизация), но так же удешевляет поддержку продукта длительное время. Так же надо понимать, что Rust не спасет от кривых рученок быдлокодеров (разве что они не смогут его освоить), так как при большом желании можно сделать и утечки памяти и дедлоки и гонки данных (хотя в Golang это все сделать на порядок проще).
    Ну и надо не забывать, что много где присутствует hype-driven-development и Golang распиарен, а Rust нет.
    Ответ написан
    3 комментария
  • Как ограничить тип T примитивными типами f32 и f64?

    bingo347
    @bingo347
    Crazy on performance...
    Ограничить дженерик-тип можно только типажами (traits).
    Что Вы хотите сделать? Какие методы f32 и f64 Вам нужны?
    Возможно данные методы уже реализованы в типажах стандартной библиотеки - тогда нужно ограничивать их суммой.

    Другой вариант, сделать свой типаж, ограничить дженерик тип им, имплементировать этот типаж для f32 и f64
    Имплементация должна представлять обертки над нужными действиями

    UPD: если нужно ограничение дженерик, на использование метода exp у f32 и f64:
    Типаж-контракт на метод exp:
    trait Exp {
        fn exp(self) -> Self;
    }
    
    impl Exp for f32 {
        fn exp(self) -> Self {
            <f32>::exp(self)
        }
    }
    
    impl Exp for f64 {
        fn exp(self) -> Self {
            <f64>::exp(self)
        }
    }


    так же можно воспользоваться следующим крэйтом:
    https://crates.io/crates/num
    Ответ написан
    2 комментария
  • Что такое mod в Rust?

    bingo347
    @bingo347
    Crazy on performance...
    mod - это объявление дочернего модуля/пространства имен
    Есть 2 способа объявления - через блок и через отдельный файл:
    // через блок
    mod some_module {
      // тут изолированное пространство имен
      pub fn hello() {
        println!("Hello world");
      }
    }
    fn main() {
      some_module::hello(); // Hello world
    }
    
    // подключаем модуль из файла ./some_other_module/mod.rs или ./some_other_module.rs
    mod some_other_module;

    так же через оператор pub можно делать реэкспорт модуля целиком, делая тем самым структуру пространств имен Вашего крэйта
    Ответ написан
    Комментировать
  • Почему выходит паника - panicked at 'panicked at 'index out of bounds: the len is 0 but the index is 0'?

    bingo347
    @bingo347
    Crazy on performance...
    У вас вектор matrix_c изначально пустой, Вы пытаетесь писать в несуществующий элемент.
    Вижу, что у Вас закоменчен вариант с методом push (почему он Вам не подошел не знаю).
    Как вариант можно сразу создать вектор нужного размера, заполненный значениями по умолчанию (например нулями):
    // добавлю пару констант, для простоты модификации
    let rows = 2;
    let cols = 2;
    
    let matrix_a =  vec![1,2,3,4];
    let matrix_b =  vec![5,6,7,8];
    let mut  matrix_c = vec![0; rows * cols]; // 0 - default, rows * cols - размер (4)
    
    for row in 0..rows {
      for col in 0..cols {
        let mut vec_buf = 0;
        for k in 0..2 {
          vec_buf = vec_buf + matrix_a[row * 2 + k] * matrix_b[k * 2 + col];
        }
        matrix_c[row * 2 + col] = vec_buf; // теперь должно быть все ок
                             // так как спокойно передаем владение существующему элементу вектора
      }
    }
    
    
    for (i, x) in matrix_c.iter().enumerate(){
      println!(" элем = {:?}, значение = {:?}", i, x);
    }
    Ответ написан
    1 комментарий