Форум программистов, компьютерный форум, киберфорум
Rust
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.67/67: Рейтинг темы: голосов - 67, средняя оценка - 4.67
Администратор
Эксперт .NET
9602 / 4744 / 761
Регистрация: 17.04.2012
Сообщений: 9,592
Записей в блоге: 14
1

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

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

Author24 — интернет-сервис помощи студентам
Psilon, чем он тебя так привлек? И почему именно "убийца плюсов"?
Если напишешь развернутый ответ, обещаю вынести в отдельную тему и погонять компилятор пару часов дабы вступить в полемику
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
12.02.2015, 04:38
Ответы с готовыми решениями:

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

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

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

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

121
555 / 148 / 58
Регистрация: 27.07.2014
Сообщений: 2,446
10.06.2015, 23:31 81
Author24 — интернет-сервис помощи студентам
Цитата Сообщение от 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
9602 / 4744 / 761
Регистрация: 17.04.2012
Сообщений: 9,592
Записей в блоге: 14
10.06.2015, 23:53  [ТС] 82
Цитата Сообщение от 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
555 / 148 / 58
Регистрация: 27.07.2014
Сообщений: 2,446
11.06.2015, 00:05 83
Цитата Сообщение от 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
6098 / 4954 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
11.06.2015, 00:08 84
Цитата Сообщение от Dennis Ritchie Посмотреть сообщение
Проще сделать как-то так:
в первом случае происходит аллокация памяти, во втором - нет.
Цитата Сообщение от Dennis Ritchie Посмотреть сообщение
А что мешает сделать, например, как-то так:
компилятор и так знает тип, вопрос в программисте.
0
Администратор
Эксперт .NET
9602 / 4744 / 761
Регистрация: 17.04.2012
Сообщений: 9,592
Записей в блоге: 14
11.06.2015, 00:10  [ТС] 85
Цитата Сообщение от Dennis Ritchie Посмотреть сообщение
Я не вижу каких-то особых причин (собственно, их нет)
Если вы их не видите, это значит нужно лучше посмотреть, а не то что их нет.
let - объявление переменной, let mut - объявление изменяемой переменной. Автовывод типа придуман для сокращения писанины (и ещё некоторых целей).
Если имя типа пишется первым во многих языках, это не значит, что нужно сделать это во всех существующих и вновь появляющихся языках.
Цитата Сообщение от Dennis Ritchie Посмотреть сообщение
А что мешает сделать, например, как-то так:
C++
1
println!("{}", typeid(result));
Время. IDE с подсказками пока нет, а для каждой переменной так делать, особенно если их очень много - затратно по времени.
Если вы читаете чужой код и под рукой нет компилятора, то такой вариант вообще не покатит.
0
204 / 26 / 5
Регистрация: 22.05.2015
Сообщений: 357
11.06.2015, 14:41 86
Цитата Сообщение от Dennis Ritchie Посмотреть сообщение
Какой толк от let и auto?
Цитата Сообщение от Dennis Ritchie Посмотреть сообщение
match — дутый паттерн-матчинг. Реально толку от него нуль.
толсто
0
555 / 148 / 58
Регистрация: 27.07.2014
Сообщений: 2,446
11.06.2015, 19:11 87
Ладненько. А шаблоны раста поддерживают вариадик-аргументы? Поддерживают ли шаблоны раста что-нибудь кроме аргументов типа?
0
Master of Orion
Эксперт .NET
6098 / 4954 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
12.06.2015, 03:51 88
Цитата Сообщение от Dennis Ritchie Посмотреть сообщение
Поддерживают ли шаблоны раста что-нибудь кроме аргументов типа?
А это нахрена? Велосипедить мета-программирование там, где оно не задумывалось? Есть же любители гланды доставать через разные интересные места
0
555 / 148 / 58
Регистрация: 27.07.2014
Сообщений: 2,446
12.06.2015, 04:30 89
Цитата Сообщение от 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
6098 / 4954 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
12.06.2015, 14:43 90
Dennis Ritchie, хватит со своим D лезть - язык убог, чуть более, чем полностью. И это тема не про него.
0
Администратор
Эксперт .NET
9602 / 4744 / 761
Регистрация: 17.04.2012
Сообщений: 9,592
Записей в блоге: 14
12.06.2015, 15:14  [ТС] 91
Dennis Ritchie, вас уже предупреждали. Следующее упоминание D в теме не про D - и получите карту.
0
zzzZZZ...
527 / 358 / 94
Регистрация: 11.09.2013
Сообщений: 2,041
16.06.2015, 00:05 92
Для тех кто в танке, ресуры с переводом:
перевод доки с раст-ланг
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
204 / 26 / 5
Регистрация: 22.05.2015
Сообщений: 357
16.06.2015, 01:00 93
Цитата Сообщение от dzrkot Посмотреть сообщение
кто объяснит почему y в match уже не y? ... а символ _ вообще выпадает при y
еще раз, только понятно.
Цитата Сообщение от dzrkot Посмотреть сообщение
хотя как я понял это аналог default в switch() в C/C++
Да. Если ни один образец не совпал, то сработает _. Без него лучше вообще не использовать PM.
1
Master of Orion
Эксперт .NET
6098 / 4954 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
16.06.2015, 01:04 94
dzrkot, потому что это переопределенная область видимости. Например, если параметр функции совпадает с именем поля класса

C#
1
2
3
4
5
6
7
8
9
class A
{
   int y;
 
   int Foo(int y)
   {
      return x;
   }
}
он же не поле вернет, а параметр.
1
zzzZZZ...
527 / 358 / 94
Регистрация: 11.09.2013
Сообщений: 2,041
16.06.2015, 08:19 95
Цитата Сообщение от Psilon Посмотреть сообщение
dzrkot, потому что это переопределенная область видимости. Например, если параметр функции совпадает с именем поля класса
хм... для меня привычнее, что в вашем примере вылезет undefined variable ... , ладно перечитаю сегодня про match
0
Master of Orion
Эксперт .NET
6098 / 4954 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
16.06.2015, 11:32 96
dzrkot, да не, вполне валидный код
Компилятор правда ворнинг покажет, но сборке ничто не помешает
Warning: parameter "y" hides field "int A.Y"
0
zzzZZZ...
527 / 358 / 94
Регистрация: 11.09.2013
Сообщений: 2,041
18.06.2015, 12:14 97
прикрутить racer не удалось, ошибки какие-то... =(
0
zzzZZZ...
527 / 358 / 94
Регистрация: 11.09.2013
Сообщений: 2,041
05.12.2015, 09:02 98
ну что как у кого дела с растом?)
0
Master of Orion
Эксперт .NET
6098 / 4954 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
05.12.2015, 13:44 99
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
9602 / 4744 / 761
Регистрация: 17.04.2012
Сообщений: 9,592
Записей в блоге: 14
05.12.2015, 17:02  [ТС] 100
dzrkot, сегодня мне удалось настроить всю связку Rust + Racer + автодополнение для Kate на Kubuntu 15.04. Есть автодополнение - теперь можно жить.

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


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

Может быть, как-нибудь соберу все эти команды в бложике. Там ничего сложного, просто чтобы не искать по разным сайтам все эти инструкции.
1
05.12.2015, 17:02
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.12.2015, 17:02
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
100
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru