LINUX.ORG.RU

Еще одно маленькое украшение в синтаксисе Rust

 


0

8

Скоро указывать включение правой границы в диапазонах станет еще удобнее!

Было:

#![feature(inclusive_range_syntax)]

fn main() {
  for i in 1...4 {
    print!("{},", i);
  }
}

=> 1,2,3,4,

Станет:

#![feature(inclusive_range_syntax)]

fn main() {
  for i in 1..=4 {
    print!("{},", i);
  }
}

=> 1,2,3,4,

... и ..= доступны только в ночной сборке, поэтому для включения этих возможностей нужно указание соответствующего атрибута.

★★★★★

Последнее исправление: Virtuos86 (всего исправлений: 1)

Было
1...4

Разве это было в stable?

Это вроде и то и то ночные фичи, закрытые за inclusive_range_syntax, просто решают что удобнее: три точки или две-точки-равно

mersinvald ★★★★★
()
Последнее исправление: mersinvald (всего исправлений: 1)

ОП, обе фичи доступны только за гейтом inclusive_range_syntax, не дезинформируй.

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

Вот обсуждение PR.

Я вообще предпочел бы синтаксис вида:

for i in |start..stop| {
Чтобы |start..stop| означало «от start до stop, включая границы», start|..stop| — «от start до stop, не включая start» и т.д. по аналогии.

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

[start..stop)

Не, сочетать разные скобки в одном выражении — это ужас.
Что три точки, что две точки-равно нисколько не говорят о том, как работает указание диапазона незнакомому с синтаксисом человеку. А если знаком, особой разницы, что парсить, нет.

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

Согласен, код должен быть по возможностям самоокументируемым.

torvn77 ★★★★★
()

любят в современных языках гордиться подобным синтаксисом, но часто ли вообще нужен диапазон?
я к тому, что раз хотят показать «а вот смотрите как можно диапазон делать» — это какой-то мем или отсылка к чему-то?
или это реально очень частый юзкейс?

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

Не то что бы очень часто, но и не редко. Хотя в чём проблема сделать обычный диапазон включительным и писать (begin..end - 1) я не вижу.

Deleted
()
Ответ на: комментарий от system-root

или это реально очень частый юзкейс?

В других языках вряд ли, но в haskell - очень частый. К тому же там различные оптимизации применяются типа list fusion. По сути список может быть и итератором в силу ленивости. Поэтому не так очевидно, есть ли оверхед и какой он, если есть.

Банальный пример. Скажем есть список элементов xs. С ними нужно что-то сделать в цикле, причем нужен еще индекс элементов. Все очень просто. Зиппим с бесконечным списком индексов и получаем нужное поведение:

forM_ (zip [0..] xs) $ \(i, x) -> do ...

Подозреваю, что в rust можно что-то подобное сделать с минимальным оверхедом

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

про ФП даже не вспомнил когда писал.
тупой мозг для экономии при агрегации берёт «закэшированные данные».

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

А потом ещё говорят, что в расте слишком много закорючек.

Unicode4all ★★★★★
()
Ответ на: комментарий от system-root

В for i in 0..=255u8 не нужно три раза i повторять, в отличие от for(unsigned char i=0; i<=255; i++).

А, извиняюсь, второй цикл - бесконечный. Правильно:

for(unsigned int i0=0; i0<=255; i0++) {
    unsigned char i = i0;
    ...
}
red75prim ★★★
()
Последнее исправление: red75prim (всего исправлений: 1)
Ответ на: комментарий от dave

Да. Можно так:

for (idx, item) in (0..).zip(&list) {
...
}
Но для этого есть встроенный метод:
for (idx, item) in list.iter().enumerate() {
...
}

Deleted
()

Три точки же удобнее, нагляднее, понятнее и по клюве меньше прыгать надо.

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

суть вопроса была в том (если представить, что я не помнил про ФП), что обычно в языках сейчас есть итераторы.
и если тебе нужно вытащить нечто из структуры, то сложно представить популярность кейса «с пятого по тридцатый элемент пожалуйста» в ООП
при этом, синтаксис выбора диапазонов приведут в quick overview языка. ссылок не дам, но по ощущениям — слишком часто.
вот и решил под шумок спросить, чёйто такую малозначимую вещь показывать.

system-root ★★★★★
()
Ответ на: комментарий от Virtuos86

Ну, haskell - отличный язык получился. На сколько помню, ты признался как-то здесь, что его так и не осилил) Хотя он довольно простой и очень лаконичный, если понять его суть, но это непросто, да. Немного необычный язык

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

И пусть принесут за одно такие же годные итераторы, как в расте.

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

Ну, haskell - отличный язык получился.

Разве я это где-то отрицал?

На сколько помню, ты признался как-то здесь, что его так и не осилил)

Да. Но я не занимаюсь охаиванием того, чего не смог изучить. У меня не тот бэкграунд, чтобы считать своё имхо каким-то важным критерием годности инструментов.

Хотя он довольно простой и очень лаконичный

Когда его пытаются сделать лаконичным, то обычно наворачивают каких-нибудь хитровыдуманных абстракций, что убивает любую простоту. А писать на нём тупой простой код хаскелистам скучно, не для этого они его выбирали.

Virtuos86 ★★★★★
() автор топика

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

pftBest ★★★★
()

Почему-то авторы ЯП никак не хотят понять, чт% из()«»%л|ие вот_Т#$$({})го гов№@ не делает язык ни удобнее, ни читаемее.

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

В чём большее удобство?

Тем, что вот такой кривой пример печатает лишнюю запятую в конце. Чтобы это починить, проще всего условие выхода внести внутрь цикла. Вообще в 30% случаев условие выхода не в сравнении с конечным значением, а в 10% - и вообще без участия переменной цикла в условии вообще.

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

Не, сочетать разные скобки в одном выражении — это ужас.

Не умеешь в элементарную математику?

В элементарной математике используются непарные скобки? В элементарной математике используются какие-то ещё скобки, кроме круглых?

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

Это конечно экономия на спичках, но не лучше ли напечатать первый элемент без запятой, а все остальные как ", item".

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

но не лучше ли напечатать первый элемент без запятой, а все остальные как ", item"

Лучше по какому критерию? Ведь у вас получается придётся проверять два условия в каждой итерации: что она первая и условие выхода.

vodz ★★★★★
()

Меня полностью устраивал синтаксис Си. Зачем выдумывать всякий шлак в синтаксисе, когда надо сосредоточиться лишь на возможностях платформы. Вот еще раз ловлю себя на мысли что D и Vala добавляют какие-то фичи платформы, но не выдумывая смрад типа fn := и прочего непонятного.

I-Love-Microsoft ★★★★★
()
Ответ на: комментарий от vodz

В чём большее удобство?

Тем, что вот такой кривой пример печатает лишнюю запятую в конце.

Кривой пример?? А какой пример будет «прямым» для иллюстрации диапазона?

30%
10%

Таким конкретным числам сложно возразить.

Virtuos86 ★★★★★
() автор топика
Ответ на: комментарий от I-Love-Microsoft

Да, теперь припоминаю. Но разве это не из алгебры? Элементарная математика это арифметика скорее.

Virtuos86 ★★★★★
() автор топика
Ответ на: комментарий от I-Love-Microsoft

[0, 1) - диапазон, от нуля включительно, и не доходя до 1. Как пример.

И самое главное ведь все сразу догадались какой будет шаг :)

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

А какой пример будет «прямым» для иллюстрации диапазона?

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

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

а вдруг из-за космических лучей счетчик прыгнет с 3 на 5 и твоя программа зациклится?

Имеено это и имеется в виду. Хотя правильнее тут конечно for(i=0; state==OK; i++), но растаманам ведь хочется свой бейсик, где такого for в принципе нельзя было записать кроме как эмуляцией с if+goto

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

Ну печатали бы по цифре на строку и хрен возразишь.

Ага. Сейчас объясню. Я не использовал макрос println!, который печатает построчно, потому что не придумал, как оформить «выхлоп», а так указал псевдострелку => и показал результат работы `main` в одной строке. В этом отношении пример из ОП действительно искусственен даже больше, чем было нужно.

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

forM_ (zip [0..] xs) $ \(i, x) -> do ...

О, прикольно, новый перл изобрели =)

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