Comments 20
Спасибо за доклад, слушал в живую.
+1
А можете ли кратко сформулировать тезисы и направление о том как надо писать, чтобы меньше переписывать после стабилизации?
Я к тому что язык видоизменяется и если сейчас что-то серьезное начать писать, то есть риск, что после стабилизации нужно будет многое проверять на корректность работы или переписывать с учетом новых реалий.
Опасение что спустя время придется многое переписывать это единственное что останавливает меня от использования Rust
Я к тому что язык видоизменяется и если сейчас что-то серьезное начать писать, то есть риск, что после стабилизации нужно будет многое проверять на корректность работы или переписывать с учетом новых реалий.
Опасение что спустя время придется многое переписывать это единственное что останавливает меня от использования Rust
0
то есть риск, что после стабилизации нужно будет многое проверять на корректность работы или переписывать с учетом новых реалий.
Это не так. Если вы начнёте писать сейчас, то вы, так или иначе, будете следовать за nightly-сборками. Но первая стабильная версия, по сути, ответвится от nightly-сборки (предварительно пройдя через статус беты), поэтому, поскольку вы следуете за nightly-сборками, вы сможете совершенно безболезненно перейти на стабильную версию и больше не переписывать свой проект из-за ломающих изменений, потому что их не будет.
+3
Вкратце-то оно классно выглядит, но порог входа страшно высокий для понимания средств библиотек, помогающих справиться с жесткостью borrow checker'а, на уровне, достаточном для написания серьезного проекта.
И с модулями в недавнем обновлении опять что-то намутили, все руки не дойдут исправить мой проект, чтобы компилировался.
Чувствую себя идиотом и теряю интерес к языку.
Все, пожаловался :)
И с модулями в недавнем обновлении опять что-то намутили, все руки не дойдут исправить мой проект, чтобы компилировался.
Чувствую себя идиотом и теряю интерес к языку.
Все, пожаловался :)
+1
но порог входа страшно высокий для понимания средств библиотек, помогающих справиться с жесткостью borrow checker'а, на уровне, достаточном для написания серьезного проекта.
На самом деле не такой уж и высокий. Достаточно уяснить для себя базовые принципы, на которых работает borrow checker (это те самое владение данными, заимствования и семантика перемещения). После некоторого количества практики вы уже интуитивно станете понимать, как писать код так, чтобы borrow checker не ругался, и борьба с компилятором плавно сойдёт на нет. У меня это заняло меньше полугода очень нерегулярного программирования в свободное время.
И с модулями в недавнем обновлении опять что-то намутили, все руки не дойдут исправить мой проект, чтобы компилировался.
Вы, вероятно, имеете в виду enum'ы? Да, пока что ломающие изменения довольно часты, но вскоре всё изменится :)
+2
Нет, именно модули. жалуется на
Существует папка modulename и mod.rs в ней.
Сейчас пришло в голову, что вроде бы были какие-то изменения как раз касательно mod.rs, но проверять сейчас не с руки.
PS не знаю, как заинлайнить на хабре код в строчку :(
use modulename;
, хотя ниже pub mod modulename;
, что настойчиво рекомендуется всей существующей документацией.Существует папка modulename и mod.rs в ней.
Сейчас пришло в голову, что вроде бы были какие-то изменения как раз касательно mod.rs, но проверять сейчас не с руки.
PS не знаю, как заинлайнить на хабре код в строчку :(
0
Странно, что такая ваша программа компилировалась, потому что подобный код не работает уже давно (и я, если честно, вообще не помню чтобы так вообще когда-то было). Можете, пожалуйста, показать, какой именно документацией рекомендуется писать use и mod для одного и того же модуля?
Как мне кажется, довольно логично, что вам не нужно делать use на модуле, который объявляется непосредственно в этом же месте. Если вы сделаете
Как мне кажется, довольно логично, что вам не нужно делать use на модуле, который объявляется непосредственно в этом же месте. Если вы сделаете
rustc --pretty=expanded crate_root.rs
, то компилятор вам выдаст представление всей единицы компиляции со всеми модулями, так как он его видит. В этом представлении очень хорошо видно, как модули вкладываются друг в друга.+1
Неточно сказал, там
Но ошибка при компиляции как раз была о том, что ему неизвестен модуль modulename, который объявляется ниже.
А вот сейчас хотел дословно ошибку привести, но тот код уже компилируется.
Значит, просто в ночной сборке модули сломались. Значит, ничего исправлять не надо :)
use modulename::Type;
Но ошибка при компиляции как раз была о том, что ему неизвестен модуль modulename, который объявляется ниже.
А вот сейчас хотел дословно ошибку привести, но тот код уже компилируется.
Значит, просто в ночной сборке модули сломались. Значит, ничего исправлять не надо :)
0
PS не знаю, как заинлайнить на хабре код в строчку :(Есть тег code: <code>use modulename;</code> станет
use modulename;
.+1
Отличное выступление, спасибо.
0
UFO just landed and posted this here
Не совсем понятно про
Тк у раста 0 оверхед на типы, то я так понимаю этот код показывает чисто силу статического анализатора. Могу ли я сделать то же самое с данными приходящими по сети или читаемыми с диска во время исполнения? И если да, то как это работает?
fn print_slice(items: &[&Show]) {
for item in items.iter() {
println!("{}", item);
}
}
print_slice(&[&1i, &2i, &"a"]);
Тк у раста 0 оверхед на типы, то я так понимаю этот код показывает чисто силу статического анализатора. Могу ли я сделать то же самое с данными приходящими по сети или читаемыми с диска во время исполнения? И если да, то как это работает?
+1
Тк у раста 0 оверхед на типы, то я так понимаю этот код показывает чисто силу статического анализатора.
Не совсем. В этом месте используются как раз trait objects, для которых применяется динамическая диспетчеризация.
Show
— это трейт, поэтому &Show
— это т.н. fat pointer, структура из двух указателей: на сами данные и на таблицу виртуальных методов трейта. За счёт такого представления ссылки на объекты разных типов, реализующих один трейт, можно положить в один массив.Безусловно, вы можете это сделать с данными, приходящими по сети, если они в вашей программе представлены типом, реализующим соответствующий трейт.
+1
Те вариант с
fn print_slice<T: Show>(items: &[T])
не имеет оверхед на данные, а fn print_slice(items: &[&Show])
имеет, что в целом все объясняет.+1
Да, примерно так, но оверхедом дополнительное разыменование указателя в 99% случаев назвать трудно :)
+1
В случае с таблицей виртуальных методов становятся недоступен ряд оптимизаций: inline функции из trait’а сделать не получится (или получится, но только вместе с inlin’ом
print_slice
, а я сомневаюсь, что компилятор сейчас на такое способен, даже если в конкретном случае такое возможно). Так что в худшем случае получите дополнительно оверхед на вызов функции (а то и двух, если шаблонная inlin’илась), плюс отсутствие оптимизаций результат inlin’а.+1
Googolplex, какую IDE вы используйте для разработки под RUST? Хочу попробовать побаловаться с Rust на Ubuntu, можете порекомендовать какую-нибудь IDE или тесктовый редактор для этих целей? Возможно вопрос нубский, но я в основном Windows-user, и из IDE на linux-е работал только с Intellij Idea и не очень разбираюсь, что обычно используют в линукс системах.
0
К сожалению, для Rust пока нет IDE. Лично я пользуюсь Vim + подсветка синтаксиса. Для IntelliJ IDEA есть плагин, включающий подсветку, но не более того. Вероятно, в будущем это изменится.
0
Сейчас пишу плагин Rust для Eclipse (плагин на Java). Есть подсветка синтаксиса, простой автокомплит (на основе слов из написанного кода), подсветка ошибок и возможность запуска приложения. Правда с Cargo пока работать не умеет, но Cargo можно добавить как External tool в Eclipse.
Если интересно могу скинуть ссылку на репозиторий и инструкции по установке.
Если интересно могу скинуть ссылку на репозиторий и инструкции по установке.
+1
Sign up to leave a comment.
Rust: абстракции и безопасность, совершенно бесплатно (видеозапись с выступления на митапе Saratov Open-IT)