Форум программистов, компьютерный форум, киберфорум
Rust
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.67/67: Рейтинг темы: голосов - 67, средняя оценка - 4.67
Администратор
Эксперт .NET
 Аватар для tezaurismosis
9674 / 4826 / 763
Регистрация: 17.04.2012
Сообщений: 9,665
Записей в блоге: 14

[Rust] Обсуждение возможностей и предстоящей роли языка Rust

12.02.2015, 04:38. Показов 16446. Ответов 121
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Psilon, чем он тебя так привлек? И почему именно "убийца плюсов"?
Если напишешь развернутый ответ, обещаю вынести в отдельную тему и погонять компилятор пару часов дабы вступить в полемику
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
12.02.2015, 04:38
Ответы с готовыми решениями:

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

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

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

121
 Аватар для Dennis Ritchie
555 / 148 / 58
Регистрация: 27.07.2014
Сообщений: 2,446
10.06.2015, 23:31
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от dzrkot Посмотреть сообщение
не нравятся мне все эти Result
Ну вообще Result должен быть спрятан за борт, т.е. примерно как-то так:
C++
1
let result = reader.read_line(&mut input_text);
Иначе, какой вообще смысл использовать let, если вам нужно чётко указывать типы? Какой толк от let и auto?
Цитата Сообщение от dzrkot Посмотреть сообщение
и Option в расте
match — дутый паттерн-матчинг. Реально толку от него нуль.
P.S. Может быть, в Rust 1.2 или 1.3 это поправят, хотя насчёт открытого Result я сомневаюсь, что это будет исправлено. Авторы немного не туда пошли.
0
Администратор
Эксперт .NET
 Аватар для tezaurismosis
9674 / 4826 / 763
Регистрация: 17.04.2012
Сообщений: 9,665
Записей в блоге: 14
10.06.2015, 23:53  [ТС]
Цитата Сообщение от Dennis Ritchie Посмотреть сообщение
Иначе, какой вообще смысл использовать let, если вам нужно чётко указывать типы?
Явно указывают тип для удобства чтения кода.
Из этого кода понятно, что, input_text имеет тип String
C++ (Qt)
1
let mut input_text = String::new();
А из этого нет, если забыл, что возвращает конкретный метод конкретного типа (и так бывает нередко)
C++ (Qt)
1
let result = reader.read_line(&mut input_text);
0
 Аватар для Dennis Ritchie
555 / 148 / 58
Регистрация: 27.07.2014
Сообщений: 2,446
11.06.2015, 00:05
Цитата Сообщение от tezaurismosis Посмотреть сообщение
Из этого кода понятно, что, input_text имеет тип String
Я не вижу каких-то особых причин (собственно, их нет) использовать let в этом примере:
C++
1
let mut input_text = String::new();
Проще сделать как-то так:
C++
1
string input_text;
Цитата Сообщение от tezaurismosis Посмотреть сообщение
А из этого нет, если забыл, что возвращает конкретный метод конкретного типа (и так бывает нередко)
А что мешает сделать, например, как-то так:
C++
1
println!("{}", typeid(result));
Благодаря typeid не должно быть никаких проблем с определением конкретного типа. Да и названия переменных как бы подсказывают, что в переменной string, а не int.
C++
1
2
3
4
// Обычная практика:
std::vector<int> v;
// Кто так пишет?
auto v = std::vector<int>;
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
11.06.2015, 00:08
Цитата Сообщение от Dennis Ritchie Посмотреть сообщение
Проще сделать как-то так:
в первом случае происходит аллокация памяти, во втором - нет.
Цитата Сообщение от Dennis Ritchie Посмотреть сообщение
А что мешает сделать, например, как-то так:
компилятор и так знает тип, вопрос в программисте.
0
Администратор
Эксперт .NET
 Аватар для tezaurismosis
9674 / 4826 / 763
Регистрация: 17.04.2012
Сообщений: 9,665
Записей в блоге: 14
11.06.2015, 00:10  [ТС]
Цитата Сообщение от Dennis Ritchie Посмотреть сообщение
Я не вижу каких-то особых причин (собственно, их нет)
Если вы их не видите, это значит нужно лучше посмотреть, а не то что их нет.
let - объявление переменной, let mut - объявление изменяемой переменной. Автовывод типа придуман для сокращения писанины (и ещё некоторых целей).
Если имя типа пишется первым во многих языках, это не значит, что нужно сделать это во всех существующих и вновь появляющихся языках.
Цитата Сообщение от Dennis Ritchie Посмотреть сообщение
А что мешает сделать, например, как-то так:
C++
1
println!("{}", typeid(result));
Время. IDE с подсказками пока нет, а для каждой переменной так делать, особенно если их очень много - затратно по времени.
Если вы читаете чужой код и под рукой нет компилятора, то такой вариант вообще не покатит.
0
 Аватар для cybercitizen
204 / 26 / 5
Регистрация: 22.05.2015
Сообщений: 357
11.06.2015, 14:41
Цитата Сообщение от Dennis Ritchie Посмотреть сообщение
Какой толк от let и auto?
Цитата Сообщение от Dennis Ritchie Посмотреть сообщение
match — дутый паттерн-матчинг. Реально толку от него нуль.
толсто
0
 Аватар для Dennis Ritchie
555 / 148 / 58
Регистрация: 27.07.2014
Сообщений: 2,446
11.06.2015, 19:11
Ладненько. А шаблоны раста поддерживают вариадик-аргументы? Поддерживают ли шаблоны раста что-нибудь кроме аргументов типа?
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
12.06.2015, 03:51
Цитата Сообщение от Dennis Ritchie Посмотреть сообщение
Поддерживают ли шаблоны раста что-нибудь кроме аргументов типа?
А это нахрена? Велосипедить мета-программирование там, где оно не задумывалось? Есть же любители гланды доставать через разные интересные места
0
 Аватар для Dennis Ritchie
555 / 148 / 58
Регистрация: 27.07.2014
Сообщений: 2,446
12.06.2015, 04:30
Цитата Сообщение от Psilon Посмотреть сообщение
А это нахрена? Велосипедить мета-программирование там, где оно не задумывалось? Есть же любители гланды доставать через разные интересные места
Да, нет. Просто хочу написать на расте, например, такую солому :
C++
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
import std.range;
import std.algorithm;
 
template mapN(Functions...)
{
    auto mapN(Range)(Range range)
    {
        static if (Functions.length == 0)
            return range;
        else
            return range
                .map!(Functions[0])
                .map!(.mapN!(Functions[1..$]));
    }
}
 
void main()
{
    auto matrix = [[1, 2, 3],
                   [4, 5, 6],
                   [7, 8, 9]];
    auto transformed = matrix.mapN!(row => row.retro, n => n-1);
    assert(transformed.equal!equal([[2, 1, 0],
                                    [5, 4, 3],
                                    [8, 7, 6]]));
}
Хотя чуток метапрограммирования и условной компиляции здесь имеется, но мне нравится такой салат.
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
12.06.2015, 14:43
Dennis Ritchie, хватит со своим D лезть - язык убог, чуть более, чем полностью. И это тема не про него.
0
Администратор
Эксперт .NET
 Аватар для tezaurismosis
9674 / 4826 / 763
Регистрация: 17.04.2012
Сообщений: 9,665
Записей в блоге: 14
12.06.2015, 15:14  [ТС]
Dennis Ritchie, вас уже предупреждали. Следующее упоминание D в теме не про D - и получите карту.
0
zzzZZZ...
 Аватар для dzrkot
527 / 358 / 94
Регистрация: 11.09.2013
Сообщений: 2,041
16.06.2015, 00:05
Для тех кто в танке, ресуры с переводом:
перевод доки с раст-ланг
http://kgv.github.io/rust_book_ru/
перевод книги Rust Essentials Ivo Balbaert, только 2 главы
http://notegeek.org/rust/603/#more-603

по поводу IDE - установил на eclipse плагин RustDT , весьма неплохо, racer ещё надо прикрутить завтра

Добавлено через 32 минуты
кто объяснит почему y в match уже не y? ... а символ _ вообще выпадает при y , хотя как я понял это аналог default в switch() в C/C++ .....
C++
1
2
3
4
5
6
7
8
9
10
11
fn main() {
    let mut x = 32;//in_i32();
    let y = 22;
    match x {
    1 => println!("one"),
    2 => println!("two"),
    3 => println!("three"),
    y => println!("TRUE , y = {}",y),
    }
    println!("x = {}" , x);
}
1
 Аватар для cybercitizen
204 / 26 / 5
Регистрация: 22.05.2015
Сообщений: 357
16.06.2015, 01:00
Цитата Сообщение от dzrkot Посмотреть сообщение
кто объяснит почему y в match уже не y? ... а символ _ вообще выпадает при y
еще раз, только понятно.
Цитата Сообщение от dzrkot Посмотреть сообщение
хотя как я понял это аналог default в switch() в C/C++
Да. Если ни один образец не совпал, то сработает _. Без него лучше вообще не использовать PM.
1
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
16.06.2015, 01:04
dzrkot, потому что это переопределенная область видимости. Например, если параметр функции совпадает с именем поля класса

C#
1
2
3
4
5
6
7
8
9
class A
{
   int y;
 
   int Foo(int y)
   {
      return x;
   }
}
он же не поле вернет, а параметр.
1
zzzZZZ...
 Аватар для dzrkot
527 / 358 / 94
Регистрация: 11.09.2013
Сообщений: 2,041
16.06.2015, 08:19
Цитата Сообщение от Psilon Посмотреть сообщение
dzrkot, потому что это переопределенная область видимости. Например, если параметр функции совпадает с именем поля класса
хм... для меня привычнее, что в вашем примере вылезет undefined variable ... , ладно перечитаю сегодня про match
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
16.06.2015, 11:32
dzrkot, да не, вполне валидный код
Компилятор правда ворнинг покажет, но сборке ничто не помешает
Warning: parameter "y" hides field "int A.Y"
0
zzzZZZ...
 Аватар для dzrkot
527 / 358 / 94
Регистрация: 11.09.2013
Сообщений: 2,041
18.06.2015, 12:14
прикрутить racer не удалось, ошибки какие-то... =(
0
zzzZZZ...
 Аватар для dzrkot
527 / 358 / 94
Регистрация: 11.09.2013
Сообщений: 2,041
05.12.2015, 09:02
ну что как у кого дела с растом?)
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
05.12.2015, 13:44
dzrkot, конец года - не до него

Добавлено через 15 минут
ну и плюс появилось желание поближе пообщаться с растом. По крайней мере многое в расте взято из него. А ФП очень полезно для общего развития. После этого лямбды в шарпе используются намного продуктивнее. Потом можно писать всякое вот такое:
C#
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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
        public static MigrationResult MigrateToVersion2(this TenderPlanVersion version)
        {
            var okpdResult = MigrateOkpd(version);
            var okvedResult = MigrateOkved(version);
            return new MigrationResult(okpdResult, okvedResult);
        }
 
        private static MigrationResultPart<IOKVED> MigrateOkved(TenderPlanVersion version)
        {
            return Migrate(version,
                            position => position.OKVEDList,
                            okved => okved.OKVED,
                            okveds => okveds.ToOKVED2s(),
                            (pos, okved, okved2) =>
                            {
                                pos.OKVED2List.Add(new TenderPlanPositionOKVED2
                                {
                                    OKVED2 = okved2,
                                    OKVED2Id = okved2.GetID(),
                                    PositionId = pos.ID,
                                    Position = pos
                                });
                            });
        }
 
        private static MigrationResultPart<OKPD> MigrateOkpd(TenderPlanVersion version)
        {
            return Migrate(version,
                            position => position.ProductList,
                            product => product.okpd,
                            okpds => okpds.ToOKPD2s(),
                            (pos, product, okpd2) =>
                            {
                                product.okpd2 = okpd2;
                                product.OKPD2Id = okpd2.ID;
                            });
        }
 
 
        /// <summary>
        /// Метод миграции для ОКПД2\ОКВЭД2
        /// </summary>
        /// <typeparam name="TOldVer">ОКПД\ОКВЭД старой версии</typeparam>
        /// <typeparam name="TNewVer">ОКПД\ОКВЭД новой версии</typeparam>
        /// <typeparam name="TSource">Тип элементов коллекции, из которых получаем ОКПД/ОКВЭД</typeparam>
        /// <param name="version">TenderPlanVersion</param>
        /// <param name="getSourceCollection">Метод получения коллекции, содержащий старый и новые объекты</param>
        /// <param name="mapFunc">Метод превращения объектов этой коллекции в ОКПД/ОКВЭД</param>
        /// <param name="toNewVer">Метод преобразования коллекции старых объектов в коллекцию новых</param>
        /// <param name="updateAction">Метод сохранения данных</param>
        /// <returns>Результат успешных и проваленых миграций</returns>
        private static MigrationResultPart<TOldVer> Migrate<TOldVer, TNewVer, TSource>(TenderPlanVersion version,
            Func<TenderPlanPosition, IEnumerable<TSource>> getSourceCollection,
            Func<TSource, TOldVer> mapFunc,
            Func<ICollection<TOldVer>, List<TNewVer>> toNewVer,
            Action<TenderPlanPosition, TSource, TNewVer> updateAction)
        {
            var positions = version.Positions;
            var succeededOkpds = new List<TOldVer>();
            var failedOkpds = new List<TOldVer>();
            foreach (var position in positions)
            {
                var olds = getSourceCollection(position).Select(mapFunc).Where(x => x != null).ToList();
                var news = toNewVer(olds);
                Trace.Assert(olds.Count == news.Count);
                var migrationMap = new Dictionary<TOldVer, TNewVer>();
                for (int i = 0; i < olds.Count; i++)
                {
                    migrationMap.Add(olds[i], news[i]);
                }
 
                foreach (var product in getSourceCollection(position))
                {
                    var old = mapFunc(product);
                    var neww = migrationMap[old];
                    bool migrated = neww != null;
                    if (!migrated)
                    {
                        failedOkpds.Add(old);
                        continue;
                    }
                    succeededOkpds.Add(old);
 
                    updateAction(position, product, neww);
                }
            }
            return new MigrationResultPart<TOldVer>(succeededOkpds.AsReadOnly(), failedOkpds.AsReadOnly());
        }
Вся мощь дженериков и делегатов по полной Лично мне очень нравится такое вынесение общего поведения.

Добавлено через 2 минуты
Хотя я когда обобщал немного лоханулся с именованием. Надо будет в понедельник порефакторить
1
Администратор
Эксперт .NET
 Аватар для tezaurismosis
9674 / 4826 / 763
Регистрация: 17.04.2012
Сообщений: 9,665
Записей в блоге: 14
05.12.2015, 17:02  [ТС]
dzrkot, сегодня мне удалось настроить всю связку Rust + Racer + автодополнение для Kate на Kubuntu 15.04. Есть автодополнение - теперь можно жить.



Всё прошло как по маслу, все команды из инструкций отработали как надо.
В Kate плагин для Rust так вообще является встроенным - только в настройках нужно указать путь к Racer и к исходникам.
Если вдруг кто-то захочет настроить всю эту радость себе, есть один момент: когда будете собирать Racer, выделите достаточно памяти, закройте всё ненужное. Если компилятор захватит своп, компиляция замедлится чрезвычайно. Одна из зависимостей компилировалась дольше всех вместе взятых в несколько раз.

Может быть, как-нибудь соберу все эти команды в бложике. Там ничего сложного, просто чтобы не искать по разным сайтам все эти инструкции.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
05.12.2015, 17:02

[Rust] Time
Подскажите как узнать время в Rust. //Rust extern crate time; fn main() { let now = time::get_time(); ...

Rust+assembler
Как связать язык rust и ассемблер не используя ассемблерные вставки(неудобно использовать их в RUSTе)?

Есть ли у rust будущее?
Вот вчера общался с 1 товарищем на тему перспектив С++, он меня убеждает что язык скоро будет терять популярность, что будущее за Go и...

Rust ошибка E0623
при компиляции появляется ошибка E0623 в документации этот номер пропущен. в чём может быть проблема? ошибка: error: lifetime...

Frontend Для RUST
Нужна помощь! Есть класс Participant, в этом классе есть функция new. impl Participant { /// Create a new `Participant`. ...


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

Или воспользуйтесь поиском по форуму:
100
Ответ Создать тему
Новые блоги и статьи
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
Нашел вот забавное видео о измерениях. Лучшее что я видел на эту тему
kumehtar 26.08.2026
ILETXiw9bMQ Основная суть и тезисы по измерениям: 0D (Нулевое измерение): точка, не имеющая длины, ширины, высоты или объема. Объект не может перемещаться в 0D. 1D (Первое измерение):. . .
[EasyBuilder Pro] Памятка по разработке для панелей Weintek
ФедосеевПавел 26.08.2026
Памятка по разработке для панелей Weintek ВВЕДЕНИЕ Ранее, при реализации проектов основное внимание уделял разработке управляющей программы для контроллера, а панели оператора доставалось время. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru