=A=L=X=
> |> _sum .>
Меня осенило - а ведь это по сути похоже на обычный сишный оператор присваивания! Только в данном случае правоассоциативный и вдобавок включающий в себя инициализацию. Сишный оператор присваивания тоже ведь по факту не только сохраняет значение в переменной, но и возвращает это значение дальше. Только у него это "дальше" находится слева, к сожалению :)
Dmitry_Milk
> в первопосте было раскритиковано введение промежуточных переменных в
> императивном коде - но ведь они по факту за кулисами ничего не меняют
Тут речь была не про эффективность машинного кода, а про легкочитаемость и лаконичность конструкции. Когда вводим кучу промежуточных переменных на каждом шаге чтобы линеаризировать выражение мы насыщаем код возможно ненужными сущностями на которые не нужно даже в идеале отвлекаться - помнить их имена или даже выдумывать их.
Но вот там где введённое имя только напротив - сократит количество кода и сущностей (не нужно повторять (str1+str2) два раза в выражении) - это только в плюс. Поэтому да, operator |> довольно разумно выглядит там где он уместен.
Что забавно - его можно употреблять в любых выражения вообще в отрыве от цепочечных вызовов:
func(( a + b) / 2 |> avg, avg ); // просто реюзаем выражение
=A=L=X=
> Что забавно - его можно употреблять в любых выражения вообще в отрыве от
> цепочечных вызовов
А как далеко распространять область видимости в таком случае? С цепочечным вызовом понятно, а тут однозначно не видно определителей области видимости. Точкозапятая?
А оператор => свободен? Мне кажется, что такой нагляднее выглядит в качестве "назначателя". Наличие знака равенства в его составе интуитивно подсказывает сишникам о том, что происходит "присваивание", но стрелочка указывает, что значение уходит не налево, а направо. А сама конструкция X => Y имеет значение, и это значение X.
(a + b) / 2 => avg .> func(_$, avg)
Dmitry_Milk
> А как далеко распространять область видимости в таком случае?
Ну да, это дискуссионный вопрос. Мне кажется логичным будет существование идентификатора до конца текущего забыл-как-называется - до ; после которой начинается следующий оператор/выражение в sequence point или как то так. Т.е., если не ошибаюсь, ровно то как живут r-value всякие.
> А оператор => свободен?
Меня он смущает своей идеологической похожестью на >=. Имхо можно перепутать и какое то время втыкать не понимая что тут происходит.
Всё-таки такая запись мне нравится всё больше и больше.
Нередко использую мин-макс для задания лимитов переменной:
max(10, min( x, 20 ) )
но в синтаксисе с .> оно и прямолинейнее и визуально проще воспринимается:
x .> max(10 ) .> min( 20 )
=A=L=X=
> Кто первый в очереди на имплементацию в своём ЯВУ?
let v = cool_table
.iter()
.collect_vec()
.tap_mut(|v| v.push("ololo"));1 frag / 2 deaths
Без пояснений это выглядит как цепочечные вызовы методов, что не есть сабж.
=A=L=X=
> что не есть сабж
Наверное имелся в виду метод tap. В некоторых языках такой метод бывает у объектов, типа "засунь объект в качестве параметра в переданное замыкание". Типа универсальный способ реализовать цепочку.
Dmitry_Milk
> засунь объект в качестве параметра в переданное замыкание
Ммм, не могу распарсить что тут имеется ввиду.
Выглядит как просто метод принимающий лямбду.
P.S.
Да и самое начало "let v =..." это уже намекает что это не сабж совсем. Сабж как раз прежде всего про выражение в чистом виде.
=A=L=X=
> Без пояснений это выглядит как цепочечные вызовы методов, что не есть сабж.
tap_mut это и есть хрень, которая позволяет в цепочку воткнуть действие, не являющееся методом
И она доступна для любого типа, потому что ржавый позволяет левые трейты приделывать к чужим типам.
=A=L=X=
> Да и самое начало "let v =..." это уже намекает что это не сабж совсем. Сабж
> как раз прежде всего про выражение в чистом виде.
Результат этой фигни можешь не засовывать в переменную, можно передать как аргумент
1 frag / 2 deaths
> tap_mut это и есть хрень, которая позволяет в цепочку воткнуть действие, не
> являющееся методом
Сабж про то чтобы вызвать функцию (а точнее любой callabee) взяв один из параметров слева, а не справа от имени функции.
То что это выглядит внешне как цепочечный вызов методов - это дань совместимости со старым кодом, а не цель.
На деле тут нет методов.
Да и цель чтобы это выглядело красиво, а не вот это вот в духе раста совершенно.
=A=L=X=
> Сабж про то чтобы вызвать функцию (а точнее любой callabee) взяв один из
> параметров слева, а не справа от имени функции.
Дык мы и взяли любой калаби (то есть лямбду), при этом вставив её в цепочку при помощи тапа.
=A=L=X=
> Да и цель чтобы это выглядело красиво, а не вот это вот в духе раста
> совершенно.
ТЗ выполнено, идите нафиг.
1 frag / 2 deaths
> Дык мы и взяли любой калаби (то есть лямбду), при этом вставив её в цепочку при
> помощи тапа.
А тип передаваемый по цепочке дальше она может сменить, кстати?
> ТЗ выполнено, идите нафиг.
ТЗ например такое:
x .> max(10 ) .> min( 20 )
где x это целое число.
Как это будет выглядеть уже интересно?
Хотя, кстати, если в расте трейты можно приделывать к чему угодно - то это и будет нормальным решением.
=A=L=X=
> если в расте трейты можно приделывать к чему угодно - то это и будет нормальным
> решением
Не совсем. Там есть "неудобное" ограничение - нельзя для типов из других модулей имплементировать трейты из других модулей. То есть либо сам тип, либо сам трейт (не имплементация) должны быть объявлены в текущем модуле.