LINUX.ORG.RU

Зачем в rust нужно keyword «impl» в параметрах и в возвращаемом значении функций?

 ,


0

7

Ау, растаманы! Почему нельзя вместо

fn f(x: &impl Trait1) -> impl Trait2 

писать

fn f(x: &Trait1) -> Trait2 

? Trait – не first class тип? Это бред, но даже если так: и что? Или может возможен конфликт одинаковых имён структуры и trait? Короче, смахивает на синтаксический оверхед.

UPD. Ну и вдогонку, чтобы дважды не вставать: «we can’t implement external traits on external types» – это не просто дичь, а просто дичь. Ну и аргументация трындец: «Without the rule, two crates could implement the same trait for the same type, and Rust wouldn’t know which implementation to use.». Вот когда конфликт возникнет, тогда и ругались бы на него.

UPD2. fn vs fun – зачем отдельный keyword для лямбд?

★★★★★

Последнее исправление: dimgel (всего исправлений: 3)
Ответ на: комментарий от anonymous

В игнор сука, в игнор! Всех в игнор!!!!1111

Именно.

dimgel ★★★★★
() автор топика
Ответ на: комментарий от khrundel

В общем текущее ограничение наиболее простое, понятное и логичное.

Ок, согласен.

dimgel ★★★★★
() автор топика
Ответ на: комментарий от Aswed

О нииееет! Миня будут игнорироватб! :(

Да! И ты это заслужил. Кайся!

anonymous
()

Почему нельзя вместо

Ну начни ещё ныть, что нет неявных преобразований из u8 в u32. Это всё таки не питон. А f(x: &impl Trait1) уже при прочтении сразу говорит, что есть что.

UPD. Ну и вдогонку, чтобы дважды не вставать: «we can’t implement external traits on external types»

Т.е. ты предлагаешь получать не совместимы друг с другом крейты? А так же стоило почитать дальше, где показывают как это обойти.

UPD2. fn vs fun – зачем отдельный keyword для лямбд?

Ну в плюсах нельзя передать [=](){}/[&](){} как простую ссылку на функцию, только [](){} может так прикинуться. В общем случае Лямбда - это объект.

З.Ы.: Хватит воспринимать Rust как замену С++. Это другого поля ягода. Он скорее замена Си в ряде задач.

AlexVR ★★★★★
()
Ответ на: комментарий от hateyoufeel

Лол что вы пытались объяснить? Вместо этого вы начали истерить сами и фанатично защищать раст мол ЭТО ТАК НАДО ТЫ НИПАНИМАИШЬ. И в этом начали обвинять его. Вопрос был конкретный. А вы оба фанатики.

anonymous
()

Больше баттхёрт-репортов по Расту для бога Раста!

anonymous
()
Ответ на: комментарий от AlexVR

З.Ы.: Хватит воспринимать Rust как замену С++. Это другого поля ягода. Он скорее замена Си в ряде задач.

У меня на данный момент сложилось впечатление, что это скорее прикладной язык, чем системный. Продвинутый, ясное дело существенно более эффективный чем всякие там жавы-котлины т.к. без VM и GC, но у C он по ощущениям отсосёт. Например, pattern matching прям очень порадовал, нормальный stack trace при ошибках в рантайме тоже, но это нифига не бесплатные вещи. У сей нету RTTI; да и на плюсах, как я слышал, его в том же гугле отключают.

Как замену плюсов я раст не рассматриваю, потому что у меня дико бомбануло от отсутствия исключений. Жопа есть а слова нет. RAII есть, а исключений нет. Приписывать ‘?’ в каждый вызов – может и не совсем уж дичь (а для сишников так вообще огромный шаг вперёд), и вместо бросания исключений из конструкторов можно возвращать Result<> из фабричного метода; но у меня нехорошие предчуствия по поводу вызова конструктора суперкласса из подкласса, да и по поводу классического ООП вообще, и предчуствия эти после этого обсуждения только усилились.

Ну и самая дичь – это panic вместо исключений. Повсюду в примерах. ЗААААШИБИСЬ надёжность: кто-то в либе случайно впилил unwrap() – и до свидания. Как сраный PHP-скрипт, который обработал один HTTP-запрос и сдох – и хрен с ним, ядро подчистит неосвобождённые скриптом ресурсы.

Гуглил за и против исключений, и в общем это хороший предмет для священных войн – всяк свои аргументы приводит (в гугле их тоже, вроде отключают). Но вот про их неэффективность – бред какой-то: в плюсах давно уже zero cost exceptions (при нормальном выполнении – т.е. по green path); а вот Result<i64, T> или Result<&T, E> через один регистр не вернёшь: ещё дискриминант куда-то надо девать (видел краем глаза пропозал, чтобы через флаги CPU его передавать, гы); и возможны ещё преобразования между Result, io.Result и т.п. на каждом уровне.

dimgel ★★★★★
() автор топика
Ответ на: комментарий от dimgel

Ваше мнение очень важно, держите нас в курсе.

anonymous
()
Ответ на: комментарий от anonymous

Вот я и говорю, что никаких. И ты сейчас подтвердил, что нормального ООП в расте нет.

dimgel ★★★★★
() автор топика
Ответ на: комментарий от dimgel

у меня нехорошие предчуствия по поводу вызова конструктора суперкласса из подкласса, да и по поводу классического ООП вообще

В Rust классического ООП нет: там нет наследования.

Legioner ★★★★★
()
Последнее исправление: Legioner (всего исправлений: 1)
Ответ на: комментарий от Legioner

Хм, я не дал выше ссылку на твой старый камент про исключения. Косяк. Плюсую всё там сказанное.

dimgel ★★★★★
() автор топика
Последнее исправление: dimgel (всего исправлений: 2)
Ответ на: комментарий от dimgel

на плюсах, как я слышал, его в том же гугле отключают.

ну а в других конторах не отключают, и что?

seiken ★★★★★
()
Ответ на: комментарий от Legioner

Кто-то может объяснить какого хрена раст тащат во все утюги? А именно, со свежей установки генты требуют Раст компилировать. А он ещё llvm тащит, сколько вообще эти инструменты компилируются на «старых» ПК? Кто-то в курсе может?

anonymous
()
Ответ на: комментарий от anonymous

На генту можно впилить rust-bin. Тащит его прежде всего мозилла, но можно также впилить firefox-bin и thunderbird-bin. А также chromium-bin и libreoffice-bin, и будет щастье. Остальное быстро собирается.

dimgel ★★★★★
() автор топика
Ответ на: комментарий от dimgel

у меня нехорошие предчуствия по поводу вызова конструктора суперкласса из подкласса, да и по поводу классического ООП

«памагите, я не могу писатб в ОО стиле, если не кейворда class»

Ну и самая дичь – это panic вместо исключений.

fn vs fun

Тебе определенно стоило побольше почитать матчасть прежде чем вбрасывать. Если бы ты чуть больше почитал или подумал сам, то понял был, что panic это не вместо исключений. Вместо исключений как раз Result. И со своей работой Result отлично справляется.

Aswed ★★★★★
()
Ответ на: комментарий от anonymous

Я добавляю CCACHE, делаю глупость?

Не глупость. Но это для сей/плюсов, а раст сорцы идут мимо.

dimgel ★★★★★
() автор топика
Ответ на: комментарий от anonymous

Я в генту не силён, сорри. ccache это кеш для результатов компиляции. На первый взгляд кажется, что смысл в этом может быть для обновлений, когда в исходниках меняется один файл, чтобы только его перекомпилировать и перелинковать. Но лучше поспрашивать практиков.

Legioner ★★★★★
()
Ответ на: комментарий от dimgel

Да у меня 3 страница хендбука. Я не знаю ничего о бинарных сборках. Мне бы хватило links, честно говоря, slim и i3.

anonymous
()
Ответ на: комментарий от dimgel

Ну и продолжай сидеть в своем маня-мирке

Aswed ★★★★★
()
Ответ на: комментарий от Aswed

В классическом ООП никаких трейтов вообще нет. Там есть классы. И есть наследование классов. Можешь посмотреть как в Java это устроено, из популярных языков там ООП почти в самом дистиллированном виде. Есть интерфейсы, но их по сути можно считать частным случаев классов.

Legioner ★★★★★
()
Последнее исправление: Legioner (всего исправлений: 1)
Ответ на: комментарий от anonymous

В общем, если пакет dev-lang/rust уже стоит (проверяешь командой eix dev-lang/rust, там под установленными пакетами будет строчка «Installed:»), тогда делаешь так:

# emerge -C dev-lang/rust
# emerge -1q rust-bin

А если не стоит, то только вторую строчку:

# emerge -1q rust-bin
dimgel ★★★★★
() автор топика
Последнее исправление: dimgel (всего исправлений: 1)
Ответ на: комментарий от dimgel

Очень доставлено, но а как мне сделать этот расто-бин? Просто поставить «как обычно» через емердж?

anonymous
()
Ответ на: комментарий от hateyoufeel

В тех же Scala или Kotlin такое налево и направо используется.

Ой ли? Про скалу спорить не буду, в ней всё есть, это какой-то перл для jvm, но вот про котлина погуглил. Нашёл тему на форуме от этого года, что мол неплохо было бы имплементить интерфейсы для существующих типов. Оттуда ссылка на пропозал KEEP-87 2017 года, который года 3 обсуждали и в 20м закрыли и ссылка на новый пропозал KT-10468, который тоже ещё только обсуждают.

khrundel ★★★★
()
Ответ на: комментарий от Legioner

Бывает, но спасибо за ответ!

anonymous
()
Ответ на: комментарий от khrundel

Я не думаю, что на JVM это можно реализовать, сохранив разумную совместимость с Java. Поэтому в Kotlin этого нет и не будет.

extension functions это вообще из другой оперы, не нужно их приплетать. Это просто сахарок, когда ты вместо f(x, y, z) пишешь x.f(y, z).

Я говорю именно про «заимплементить интерфейс для чужого типа».

Хотя наверное можно сделать что-то вроде

class LibraryClass { ... }
interface MyInterface { ... }
class LibraryClass$MyInterface$1 implements MyInterface {
    private final LibraryClass $this;
    static MyInterface wrap(LibraryClass c) {
        return new LibraryClass$MyInterface$1(c);
    }
    ...
}

LibraryClass c = ...;
MyInterface i = LibraryClass$MyInterface$1.wrap(c);

где всё, что с долларами, будет неявно генерироваться и подставляться. Правда будут нежданчики вроде c != i, но в Kotlin с SAM-типами уже что-то похожее есть.

Legioner ★★★★★
()
Последнее исправление: Legioner (всего исправлений: 2)
Ответ на: комментарий от dimgel

Возможно, известно сколько он «примерно» собирается? Хватит 1,5Гб ОЗУ + 6Гб свапа? Гугл забанил, а из утки поисковик не очень, по моим текущим поисковым запросам.

Или же надо отказаться от Gentoo, так как компьютер не тянет «это всё»?

anonymous
()
Ответ на: комментарий от anonymous

Маловато будет. Если собирать в одно-два ядра (MAKEOPTS=-j2 в make.conf), то может и влезет. Только сколько времени это займёт… Своп здесь больше во вред, работа с памятью при компиляции очень интенсивная. В общем, я бы не стал.

dimgel ★★★★★
() автор топика
Ответ на: комментарий от dimgel

Понял. А что за дистр можно выбрать тогда? Мне на 32-бита надо, и хотя бы иллюзию скорости/отзывчивости/поддержки.

P. S. Ссылку другой аноним привёл.

anonymous
()
Ответ на: комментарий от anonymous

А хз. Сам я наверное глянул бы в сторону Arch, но он ЕМНИП уже 64-bit only. На вике ЕМНИП были страницы с таблицей дистров и их характеристиками, в т.ч. по идее должна указываться поддержка 32 бит. А из них уже выбирай по популярности и отзывам.

dimgel ★★★★★
() автор топика
Ответ на: комментарий от dimgel

Посмотрю в сторону Дебиана. Жалко, блин, так хотелось генту поставить, а тут такое.(

Спасибо за сэкономленное время и помощь!

anonymous
()
Ответ на: комментарий от dimgel

ЕМНИП уже 64-bit only

Да, только х86_64, хотя есть порты его и на другие платформы.

по популярности

Не популярность, а переход на страницы. Вот что-то похожее на популярность Какую операционную систему и/или дистрибутив GNU/Linux вы используете на ПК. А ещё лучше смотреть на гуглотренды.

fernandos ★★★
()
Ответ на: комментарий от anonymous

Жалко, блин, так хотелось генту поставить, а тут такое

Могу посоветовать попробовать хайку, хорошая ОС.

Дебиан мне не понравился.

Можете попробовать калькулейт, это бинарная гента. У меня с ним были проблемы, но слышал много хвалебного про этот дистрибутив. Я же на своём ноутбуке поставил генту и бинхост от калькулейта. Сначала просто хотел посмотреть, что развалится (и как скоро), но вот уже несколько месяцев вроде всё нормально.

fernandos ★★★
()
Ответ на: комментарий от Legioner

То что в джаве сделано что-то как-то не является показателем того, что это правильно. Джава - обычный язык, и уж точно не эталон реализации ООП. Если уж так хочешь «эталонное ООП», то тебе в smalltalks и это совсем не джава. ООП это не про «классы», а про наследование, инкапсуляцию и полиморфизм, и инструментами раста это вполне удобно делать. Собсна для ООП вообще не нужно ни «классов» ни «трейтов». В ОО стиле можно даже на С писать, хоть это вообще не будет удобно.

Aswed ★★★★★
()
Ответ на: комментарий от fernandos

Да, я посмотрю на Хайку перед Дебианом, спасибо. Любопытно посмотреть. А тем более, что у меня под неё есть реальное железо и время.)

О калькулейте плохого ничего не слышал, но пользоваться добровольно не буду.

anonymous
()

как замена плюсов? там даже ООП толком нет. бери D и треду конец.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.