Вернуть итератор

Aug 23, 2016 05:36

А между тем, зацените, в nightly rust научились делать вот так:

#![feature(conservative_impl_trait)]

fn numbers() -> impl Iterator {
1 ..
}
Дословно, мы из функции возвращаем некоторый анонимный тип, всё что известно про которого - это то, что он реализует типаж Iterator, ассоциативный тип Item коего установлен в i32Выглядит сумбурно, ( Read more... )

code, anonymous type, rust, programming language, iterator, closures, trait

Leave a comment

Comments 15

thedeemon August 23 2016, 06:04:45 UTC
А что в Расте с тайп-левел арифметикой? У меня на плюсах некоторое количество важного кода, который я считал непереводимым на другие языки. Там много функций, работающих с изображениями поблочно, причем размер блока передается в ф-ию шаблонным параметром, в результате я могу спокойно разместить на стеке (с нужным выравниванием) несколько блоков нужного размера и работать с ними, и компилятор в каждом случае будет точно знать число итераций в циклах и сможет правильно анроллить эти циклы и оптимизировать между итерациями. При этом ф-я, работающая с блоками NxN, может их бить на части и рекурсивно вызывать себя или соседние ф-ии для обработки блоков (N/2)x(N/2), те могут делить блоки дальше и т.д. Т.е. мне нужны целые числа, которые можно делить/умножать, и которые в рамках одного вызова ф-ии при этом компайл-тайм константы, и при этом я не хочу эти ф-ии по много раз писать, т.к. кроме значений этих констант они могут и не отличаться. Кроме того мне нужно уметь передавать туда-сюда "блоки", размер которых должен быть отражен в типе ( ... )

Reply

metaclass August 23 2016, 06:41:33 UTC
А на каком языке это изначально написано?

Reply

thedeemon August 23 2016, 06:51:19 UTC
Тут у меня в примерах псевдокод.
А настоящий код тот на С++.

Reply

swizard August 23 2016, 14:14:15 UTC
Ну вот ровно прямо так же точно нельзя - в расте генерики можно биндить только типами, а значениями нет.

Конкретно твой пример можно сделать, если вынести параметр из шаблона в название, типа: Block2, Block4, Block8 и тд - и дальше макросом, чтобы не писать одно и то же для каждого блока.

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

Reply


nponeccop August 23 2016, 12:48:52 UTC
Внезапно они поддерживают MSVC ABI обеих битностей. Как я понимаю, просто собираясь последним MSVC. И даже, внезапно, не NSIS. Интересно, MS законтрибутила?

Reply

swizard August 23 2016, 14:17:08 UTC
Про мс не знаю, но да, надо признать, что но они там достаточно аккуратно поддерживают всякие маргинальные оси, включая виндовс :)

Это необходимо, они же собираются на расте браузер переписать.

Reply

Тролл моде он nponeccop August 23 2016, 16:16:21 UTC
Ага, с 85% десктопа и 50% девелоперских тачек винда конечно маргинальная, ну-ну.

Это даже если забыть известный прикол про самую популярную ОС в мире по количеству запущенных копий.

Reply

Re: Тролл моде он swizard August 23 2016, 17:52:57 UTC
Ну конечно маргинальная :) Rust, кстати, первый современный opensource компилятор, где я наблюдаю, как разработчики ответственно поддерживают винду. Обычно на неё либо совсем забивают, либо тратят минимум усилий по остаточному принципу, а баги и фичреквесты могут в трекере годами висеть.

Reply


4da August 23 2016, 14:00:04 UTC
> Короче, я повторю свою мысль ещё раз: в 2016-м не может быть ни единой причины писать что-то на C++, когда есть Rust.

QML уже портировали на rust?

Reply

swizard August 23 2016, 14:18:32 UTC
Ну вот, попробуй: https://crates.io/crates/qml

Reply


tancorko December 24 2016, 20:29:52 UTC
А с чем связана сложность вернуть замыкание/итератор?

Reply

swizard December 26 2016, 00:04:24 UTC
Глобально, никакой особой сложности нет. Но конкретно в Rust с подобного рода возвращаемыми значениями есть пара тонкостей ( ... )

Reply

tancorko December 26 2016, 09:01:02 UTC
"а для замыкания в ряде случаев и вовсе невозможно, так как для них компилятор генерирует уникальный анонимный тип, который используется только для автовыведения типов"

Вот теперь ясно. Спасибо за развернутый ответ.
Осталось в stable дождаться.

Reply


Latest spot anonymous February 15 2017, 12:36:10 UTC
Study my altered engagement
free mobile games for android phones sexy live wallpaper for android free mobile apps sites mixxxer sex app android free download game
http://adult.android.market.sexblog.pw/?diagram.willow
downloads free apps android play store apps download for pc best android free rpg games best adult hookup download update android

Reply


Leave a comment

Up