Форум программистов, компьютерный форум, киберфорум
Rust
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.88/25: Рейтинг темы: голосов - 25, средняя оценка - 4.88
Заблокирован

Rust не хватает функциональности?

20.08.2020, 17:24. Показов 5640. Ответов 29
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Rust вобрал в себя немало из функциональных языков, но ему, по-моему мнению, все же функциональности не достает.
Простой пример: вы почему-то захотели написать свою функцию swap, которая меняет местами два ближайших элемента в векторе, а не воспользоваться уже существующей. Возможно вы не знали про ее существование или вам нужен немного другой функционал. Поскольку язык императивный, то вы решили сначала попробовать поменять местами элементы с помощью обмена через третью переменную. Но тут работать это не будет, так как нельзя одновременно заимствовать ссылку на объект и изменят этот же объект.
Как человек который знает как хорошо дело обстоит с алгоритмами в языке Lisp, как это там удобно благодаря широкому набору необходимых функций.
Начнем смотреть - есть метод first(), который возвращает ссылку на первый элемент вектора; есть метод pop() который возвращает последний элемент вектора и удалет его же из этого вектора; есть метод last() - в целом неплохо, но не хватает методов вроде second(), rest() и прочих, которые бы сделали жизнь намного проще. Интересно почему создатели забили на них и не определили их для этой коллекции и прочих коллекций?

Как пример
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
fn second(v: &[i32]) -> Option<i32> {
  if v.len() >= 2 {
     let r = v[1];
     Some(r)
  } else {
     None
 }
}
 
fn rest(v: Vec<i32>, num: usize) -> Option<Vec<i32>> {
    if v.len() > num  {
     let new_vec = v[num..].iter().map(|x| *x).collect::<Vec<i32>>();
     Some(new_vec)
    } else {
       None
  }
    
 }
       
fn main() {
  let mut vector = vec![1,2,3,4,5,6,7,8,9];
  let mut new_vector = vec![]; 
   for _i in 0..v.len() {
     if v.len() >= 2 {
       new_vector.push(second(&vector).unwrap());
       new_vector.push(*(vector.first().unwrap()));
       vector = rest(vector, 2).unwrap();
   }
  }
 
 for i in &new_vector {
    println!("{}", i);
 }
}
Поменяли местами элементы.
1
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
20.08.2020, 17:24
Ответы с готовыми решениями:

[Rust] Обсуждение возможностей и предстоящей роли языка Rust
Psilon, чем он тебя так привлек? И почему именно &quot;убийца плюсов&quot;? Если напишешь развернутый ответ, обещаю вынести в отдельную тему и...

[Rust] Как привязывать WinAPI-функции к коду на Rust?
Может кто-нить дать код, КАК привязывать вин апишные функции к растовскому коду (на примере MesageBox). ...

Расскажите о своём опыте программирования на Rust
Доброе утро! Расскажите, пожалуйста, о своём опыте программирования на Rust. Можно в сравнении с C# или Delphi. Спасибо.

29
║XLR8║
 Аватар для outoftime
1212 / 909 / 270
Регистрация: 25.07.2009
Сообщений: 4,361
Записей в блоге: 5
07.09.2020, 18:23
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от sodda Посмотреть сообщение
В Rust есть swap, но если посмотреть внутрь, то эта функция меняет местами сырые указатели в unsafe блоке.
В плюсах swap уже давно делается через rvalue ибо незачем менять блоки памяти если можно поменять указатели. Мало ли каких они могут быть размеров.

И если бы я писал руками, я бы сделал как в std, через сырые указали и с unsafe.

Что касается замены местами переменных, лучше всего тут подойдёт move а не copy/clone.

C++ (Qt)
1
2
3
4
    let (x, y) = (0, 1);
    println!("x: {}, y: {}", x, y);
    let (x, y) = (y, x);
    println!("x: {}, y: {}", x, y);
Поставьте корректно вопрос, получите корректный ответ. Если вкратце, в языке есть много чего и его надо использовать в нужном месте. swap для переменных, элементов вектора и, возможно, ещё для чего-то это разные вещи.

Добавлено через 1 минуту
Цитата Сообщение от sodda Посмотреть сообщение
Rhs, к слову, расшифровывается как right-hand side. Этот акроним постоянно используются в подомного рода трейтах.
А other расшифровывается как "другой, и мне всё равно какая функция там будет, мне сказали макрос сделать".
0
Заблокирован
07.09.2020, 18:51  [ТС]
Цитата Сообщение от outoftime Посмотреть сообщение
Что касается замены местами переменных, лучше всего тут подойдёт move а не copy/clone.
Ну то, что вы написали - это как раз и есть copy.
Цитата Сообщение от outoftime Посмотреть сообщение
let (x, y) = (0, 1);
0, 1 - это цифры, то есть примитивный тип: по умолчанию i32.
Это копируемый тип. И у вас x копируется в y, а y копируется в x.

Move - это передача владения у клонируемых типов.

C++ (Qt)
1
2
3
4
let mut owned = "Mir".to_string();
let mut new_owner = owned;
println!("{}", owned);
//ошибка: владение строкой перешло к new_owner, a owned неинициализированна
Цитата Сообщение от outoftime Посмотреть сообщение
А other расшифровывается как "другой, и мне всё равно какая функция там будет, мне сказали макрос сделать".
Вы не поняли. Ну и ладно.
0
║XLR8║
 Аватар для outoftime
1212 / 909 / 270
Регистрация: 25.07.2009
Сообщений: 4,361
Записей в блоге: 5
07.09.2020, 19:04
Цитата Сообщение от sodda Посмотреть сообщение
Вы не поняли. Ну и ладно.
Есть 100500 задач которые надо решать а не сводить макросы которые мало кто читает к какому-то мифическому соглашению, когда в части документации всё ровно.
0
Заблокирован
07.09.2020, 19:15  [ТС]
Цитата Сообщение от outoftime Посмотреть сообщение
Есть 100500 задач которые надо решать а не сводить макросы которые мало кто читает к какому-то мифическому соглашению, когда в части документации всё ровно.
Я сейчас проверил и все нормально оказалось. Можно так делать. Имя переменной в определении метода и в его реализации роли не играет, если это не self. Это немного странно.

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
trait Plus {
  fn plus (self, y: i32) -> i32;
}
 
impl Plus for i32 {
  fn plus (self, z: i32) -> i32 {
    self + z
  }
}
 
fn main() {
  println!("{}", 10.plus(9));
 
}
0
Модератор
 Аватар для Curry
5164 / 3519 / 536
Регистрация: 01.06.2013
Сообщений: 7,656
Записей в блоге: 9
07.09.2020, 21:28
Цитата Сообщение от sodda Посмотреть сообщение
Имя переменной в определении метода и в его реализации роли не играет, если это не self. Это немного странно.
В других языках также.
С++
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
using namespace std;
 
struct Foo {
    static int foo(int x, int y);
};
 
int Foo::foo(int x, int z)
{
    return x+z;
}
 
int main() {
    cout << Foo::foo(2,8)<< endl;
    return 0;
}

С#
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
using System;
 
interface IFoo
{
    void foo(int x);
}
 
public class Test  : IFoo
{
    public void foo(int z)
    {
        Console.WriteLine(z);
    }
    
    public static void Main()
    {
        Test t=new Test();
        t.foo(28);
    }
}
0
Заблокирован
07.09.2020, 22:29  [ТС]
Цитата Сообщение от Curry Посмотреть сообщение
В других языках также.
Я с ними не настолько знаком.
0
║XLR8║
 Аватар для outoftime
1212 / 909 / 270
Регистрация: 25.07.2009
Сообщений: 4,361
Записей в блоге: 5
10.09.2020, 00:18
Цитата Сообщение от sodda Посмотреть сообщение
Я с ними не настолько знаком.
В плюсах это ярко выражено. У тебя может быть заголовочный файл на пару сот строк и реализация в отдельном файле на пару тысяч сток. Если бы надо было сводить названия переменных сигнатур в этих файлах, гемора было-бы... Хотя в расте реализацию выносить не принято в отдельный файл, но проблема всё та же даже в пределах одного файла если разброс кода больше одного экрана уже не удобно.
0
Заблокирован
10.09.2020, 00:22  [ТС]
Цитата Сообщение от outoftime Посмотреть сообщение
Хотя в расте реализацию выносить не принято в отдельный файл, но проблема всё та же даже в пределах одного файла если разброс кода больше одного экрана уже не удобно.
В расте, как правило, есть один мод файл в котором просто объявлены другие модули.
Вообще да, это может запутать и придется долго концы с концами сводить.
0
Заблокирован
17.03.2021, 14:06
Rust
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
fn main() {
 
    let mut v = vec![1,2,3,4,5,6,7,8];
    let len = v.len();
    let mut shift = 0;
    
    while shift < len-1 {
        v.swap(shift, shift + 1);
        shift += 2;
    }
    
    for i in &v {
    print!("{} ", i);
   
         
    } 
 
}
или так

Rust
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
use std::ptr;
 
fn main() {
 
 let mut v = vec![1,2,3,4,5,6,7,8];
 let vlen = v.len()/2;
 let mut step = 0;
 
 for i in 0..vlen {
     let xptr: *mut i32 = &mut v[i + step as usize];
     let yptr: *mut i32 = &mut v[i + step + 1 as usize];
     unsafe {
       ptr::swap(xptr, yptr);
     };  
     step += 1;
     
 }
    
    for i in &v {
        print!("{} ", i);
    }
 
}
0
Модератор
 Аватар для Curry
5164 / 3519 / 536
Регистрация: 01.06.2013
Сообщений: 7,656
Записей в блоге: 9
17.03.2021, 23:26
RatPoison, проще так
Rust
1
2
3
 for i in (0..v.len()).step_by(2) {
      v.swap(i, i+1);
 }
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
17.03.2021, 23:26

Выводится сообщение о том, что не хватает памяти, хотя памяти хватает
Файлы подкачки отключил и включать не собираюсь. Когда свободной памяти остаётся примерно гиг-полтора начинают &quot;помирать&quot;...

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

Режим ограниченной функциональности
Привет всем! После переустановки винды 7(64)все выглядит как то иначе. Полоса в низу рабочего стола не прозрачная, ечли навести курсор на...

Анализ функциональности кода
Нужно анализировать код на предмет того, что он делает. Т.е. разобрать код по типу синопсиса и по какому-нить справочнику определить ...

Режим ограниченной функциональности
1) Найти сумму и число тех элементов заданного массива X1,X2, … ,Xn, которые попадают на заданный отрезок. 2)Задан целочисленный...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
30
Ответ Создать тему
Новые блоги и статьи
сукцессия 33. открытые вопросы от клауде
anaschu 19.07.2026
"Что накопилось за эту часть А — тринадцать правок, из которых шесть пришли из ваших вопросов и каждая оказалась реальной ошибкой, а не калибровкой: односторонний симбиоз, отсутствующий листопад,. . .
32 сукцессия
anaschu 19.07.2026
сукцессия 28‑мерное ядро стабилизировано Коллеги, фиксирую разбор инженерных правок и их изоморфную проекцию на экономику, меметику и половой отбор. Модель теперь не «подкручивает» сходимость —. . .
сукцессия 31: модель микоризы - это модель ещё нескольких явлений, социальных и экономических
anaschu 18.07.2026
Теория «Всего»: апдейт v1. 1. 2 — 28‑мерное ядро стабилизировано Коллеги, фиксирую разбор инженерных правок и их изоморфную проекцию на экономику, меметику и половой отбор. Модель теперь не. . .
сукцессия 30. Массив проверяющих друг друга моделей
anaschu 18.07.2026
Архитектура сети взаимопроверяющих моделей микоризной сукцессии (v2. 0) Развитие тензорного ОДУ-ядра и создание кросс-платформенного калибровочного полигона Уважаемые коллеги! В продолжение. . .
Грибы - это женщины, деревья - это мужчины. Анти инь янь для союза мужчины и женщины.
anaschu 18.07.2026
ГЛАВНЫЙ НАУЧНО-ФИЛОСОФСКИЙ ВЫВОД: Сексуально-Репродуктивный Капитализм против Государства Моногамии Коллеги, мы вышли на финишную прямую 20-мерного ОДУ-моделирования вековой сукцессии (ветка. . .
Текстовый слайдер с нумерацией страниц и кроссбраузерность.
russiannick 18.07.2026
Один мой друг написал текстовый слайдер с нумерацией страниц. Сегодня я расскажу как он умудрился подружить его с кроссбраузерностью. Очевидно сложно угодить с шириной каждому браузеру. Один крадет. . .
Грибы - это мемы, дерево - это человек. Применение микоризной модели к теории меметики Докинза.
anaschu 18.07.2026
Меметический изоморфизм теории «всего»: Грибная сукцессия как модель эволюции идей Докинза Базовый код системы ОДУ микоризной сукцессии описывает не просто биологию, а универсальную. . .
Грибы - это корпорации, деревья - это государства. Механизм массонского захвата власти
anaschu 18.07.2026
Макроэкономический изоморфизм теории «всего»: Грибная сукцессия как модель транснационального капитализма Базовый код системы ОДУ микоризной сукцессии описывает не просто биологию, а. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru