• Как оптимизировать код в rust при помощи trait?

    Trame2771
    @Trame2771
    Как я понял, дать гарантии компилятору, для того, чтобы сделать то, что вы хотите, пока нельзя, или сделать это будет очень неочевидно. Гарантии нужны потому что язык безопасный. Возможно когда добавят кастомные маркеры в язык, тогда можно будет чё-то гарантировать. А пока можно пользоваться макросами. Это не так плохо как кажеться. Это не нагружает бинарник, нагружает только компилятор. Причем линейно. Нагрузка на компилятор будет составлять (Количество типов * количество функций). Правда если будет использоваться больше одного типа в структуре, тогда будет применятся комбинаторика для определения нагрузки на компилятор. То есть само приложение будет таким же производительным, правда из-за нагрузки на компилятор, он может перестать немного оптимизировать код. Вот решение чтобы не дублировать код:
    mod float_trait {
        pub trait Float {}
        impl Float for f32 {}
        impl Float for f64 {}
    }
    
    use crate::float_trait::Float;
    
    mod float_struct {
        use crate::float_trait::Float;
    
        #[derive(Debug)]
        pub struct FloatStruct<T: Float>
        {
            _a: i8,
            _b: String,
            pub c: T,
        }
        
        macro_rules! impl_float_struct {
            ($($type:ty),*) => {
                $(
                    impl FloatStruct<$type> {
                        pub fn new() -> Self {
                            Self {
                                _a: 2,
                                _b: String::from("hi"),
                                c: 0.3,
                            }
                        }
                    }
                )*
            }
        }
        
        impl_float_struct![f32, f64];
    }
    
    fn main() {
        let fs = float_struct::FloatStruct::<f32>::new();
        println!("{:#?}", fs.c)
    }


    Другое решение, очевидно нагружающее само приложение, и лёгкое для компилятора
    mod float_trait {
        pub trait Float {}
        impl Float for f32 {}
        impl Float for f64 {}
    }
    
    mod float_struct {
        use crate::float_trait::Float;
    
        #[derive(Debug)]
        pub struct FloatStruct<T: std::str::FromStr + Float>
        {
            _a: i8,
            _b: String,
            pub c: T,
        }
    
        impl<T: std::str::FromStr + Float> FloatStruct<T> {
            pub fn new() -> Self {
                Self {
                    _a: 2,
                    _b: String::from("hi"),
                    c: {
                        let Ok(r) = "0.3".parse::<T>()
                            else {unreachable!()};
                        r
                    }
                }
            }
        }
    }
    
    fn main() {
        let fs = float_struct::FloatStruct::<f32>::new();
        println!("{:#?}", fs.c)
    }
    Ответ написан
    1 комментарий
  • Почему атрубут из extern prelude не работает при re-export-е в модуль?

    Trame2771
    @Trame2771 Автор вопроса
    Я кажеться понял. Это вопрос больше не к языку, а к либе. По сообщаемой компилятором ошибке мне кажеться, что атрибут не из модуля с целевым типом каким-то образом видит этот тип с префиксом пути к типу и его алгоритм парсинга ломается. Он считает часть описания типа, которая относиться к пути до него, частью самого типа и не может сапоставить такой тип с указанными атомарными у себя
    Ответ написан
  • Это приложение вирусное?

    Trame2771
    @Trame2771
    телефон стал жутко лагать

    Это могло произойти по каким угодно причинам

    Но всё выглядит так, как будто это был вирус, так ли это?

    Вы и правы и не правы одновременно. Формально это не вирус, а на деле так оно и есть. Вирус семейства "майнеры", в нашем случае реклаймер

    Если не устанавливали приложение значит оно скорее всего системное, можете выключить его, сведя его активность на нет, или же удалить, но тут нудно либо adb, либо рут. Безопаснее через adb, в интернете есть простые гайды как это сделать (нужно пк)

    На а вообще если переживаете за работоспособность смартфона то можете перестать, в кирпич он не превратится. Во-первых, в оффициальных магазинах (Appgallery - офф. магазин huawei) не должно быть вредоносных программ. А во-вторых сейчас реализовать вредоносные программы на андроиде очень сдожно. Если реализовывать, то необходимо пользователя заставлять не просто давать какие-то разрешение, но и ещё делать очень странные махинации по типу включения режима отладки в настройках разработчика. Если приложение спокойно работает без запрос от вас подозрительных действий, то оно не сможет найти путь как причинить вам вред, кроме как занимать место не телефоне или жрать трафик в фоновом режиме ну и подобное
    Ответ написан
    Комментировать
  • Как достать данные из приватной директориии termux?

    Trame2771
    @Trame2771 Автор вопроса
    Если вызвать у android диалог выбора файлов, то можно увидеть следующее:
    645544ce7ba86165415147.jpeg

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

    А для полного доступа есть total commander со своей опцией "Заданнное пользователем расположение", что вызовет тот же самый диалог, позволяя полностью управлять домашней папкой termux и пихать в неё что душе угодно

    Оффтопик
    Увидел я это в видео какого-то индейца, который разговаривал на родном языке
    Ответ написан
    Комментировать
  • Как использовать namespace в header?

    Trame2771
    @Trame2771 Автор вопроса
    Сорян, я просто не понимал, что тут #include просто вставляет текст из файла. Это куда проще, просто после java не привычно...
    Ответ написан
    Комментировать
  • Почему не получается найти минимальное ненулевое число в массиве?

    Trame2771
    @Trame2771
    Просто поставь проверку для присвоения Min(вообще такие переменные с маленькой буквы пишутся)
    Например:
    int min;
    int nextI, nextJ
    for (int i = 0; i < 5; i++){
    	for (int j = 0; j < 5; j++) {
    		if (arr[i][j] != 0) min = arr[i][j];
    		nextI = i;
    		nextJ = j;
    	}
    }
    if (nextI == 4) {
    	nextI = 0;
    	nextJ++;
    } else {
    	nextI++;
    }
    for (int i = nextI; i < 5; i++){
    	for (int j = nextJ; j < 5; j++) {
    		if (arr[i][j] != 0 && arr[i][j] < min) min = arr[i][j];
    	}
    }

    Можно инкапсулировать все в два метода
    Ответ написан