LINUX.ORG.RU

Пытаюсь тут обмазаться ржавчиной.

 ,


0

4

Например вот такой кусок кода на Java:

public static void collect( Map<String, Boolean> map, List<String> list){
    map.entrySet().stream().filter( Map.Entry::getValue ).map( Map.Entry::getKey ).collect( Collectors.toCollection( () -> list ) );
}


и пытаюсь такое же применить в Rust
fn test_collect<'a>( map: &'a HashMap<String,bool>, vec: &mut Vec<&'a String> ){
	let mut cc:Vec<&String> = map.iter().filter(| &(_, v) | *v ).map(| ( k, _ ) | k ).collect();
	vec.append(&mut cc);
}


Что-то не нахожу как сделать без промежуточного вектора.

cast tailgunner, DarkEld3r

★★★★★

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

Простите, я тут вклинюсь с нубским вопросом. Из туториала:

let guess: u32 = match guess.trim().parse() {
    Ok(num) => num,
    Err(_) => continue,
};

parse(), по логике, не должен знать, что от него хотят u32. Но если ввести число больше u32, то вернется ошибка. Что это за магия?

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

Я бы даже вынес итератор отдельно

fn test_collect<'a>(map: &'a HashMap<String, bool>, vec: &mut Vec<&'a String>) {
    let it = map.iter().filter(|(_, ref v)| v).map(|(k, _)| k);
    vec.extend(it);
}

quantum-troll ★★★★★
()
Ответ на: комментарий от makoven

Вывод типов. `parse` параметризуется типом `F` и возвращает значение типа `Result<F, F::Err>`, `match` же достаёт `F` из `Result<F, F::Err>`. Так как всё выражение должно иметь тип u32, то и `parse` параметризуется этим типом.

quantum-troll ★★★★★
()

и пытаюсь такое же применить в Rust

А зачем вообще так извращаться? Почему не:

fn test_collect(map: &HashMap<String,bool>) -> Vec<&String>{
    map.iter().filter(| &(_, v) | *v ).map(| ( k, _ ) | k ).collect()
}
anonymous
()
Ответ на: комментарий от makoven

Там _вывод_ типов, а не определение типа при присвоении значения.

Вот пример, где вывод вообще на несколько statement-ов разбит: http://rustbyexample.com/cast/inference.html

Не смог найти где описано, как он работает и какие у него ограничения, интересно, вообще.

Kuzy ★★★
()

Кто-то хочет запилить подсветку для раста? Зеленые блоки в кавычках прямо ааа

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

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

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

Потому что надо добавить в уже существующий вектор.

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

vec.extend

Блин, не там смотрел.
А ответ был на поверхности.

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

Шутка сама напрашивается

Сверху: функция collect здорового человека.

Снизу: функция collect курильщика.

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

Даже мне, программисту на Яве, всё понятно.
Я уж не говорю про каких нибудь любителей сишечки с плюсами.

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

Просто ты привык к Коболу^Wпохапе.

В какой ЯП податься ? (комментарий)

:)

...

Rust, пока похож на такой же w/o, как Perl (на котором я, кстати, дофига писал в прошлом и пописываю сейчас), Ruby или упомянутый в теме Haskell. Рынок не любит w/o :) Даже если кто-то такое свободно читает...

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

Даже мне, программисту на Яве, всё понятно.

Вопрос не в понятности. А в токенизации чтения. Java тут далеко не идеал, но весьма неплоха на фоне многих. Понять-то можно хоть Brainfuck, вопрос в скорости беглого, по диагонали, восприятия незнакомого кода.

Я уж не говорю про каких нибудь любителей сишечки с плюсами.

C/C++ от Java отличается с точки зрения читабельности не сильно. Одного уровня языки.

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

Одного уровня языки.

Лол, нет.

Особенно когда сталкиваешься с сишечными нагромождениями по типу char *(*(**foo [][8])())[]
Или плюсовыми темплейтами.

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

Одного уровня языки.

Лол, нет.

Ну, это когда их только между собой сравниваешь :)

Особенно когда сталкиваешься с сишечными нагромождениями по типу

Там очень примитивная семантика и настоящие нагромождения — большая редкость. Конечно, Си немного сложнее в восприятии, чем Java, но, повторюсь, это один уровень.

Чтобы понять разницу в уровнях сравнивать надо Java/C/C++ с Python, Lisp, Forth, Haskell, APL, ассемблерами...

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

Не согласен, что Perl сейчас на рынке почти не играет?

Я процитировал, с чем не согласен.

навскидку: http://githut.info/

И? Это всего лишь слепок _текущей ситуации_. Если что, титул duct tape of the internet - это как раз признание рынком. Человек, который «дофига писал» на Perl, должен был бы это понимать.

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

Я не понимаю, а чем вышеприведённый код сложен в восприятии?

Если отключить нахрен не работающую подсветку, то всё понятно же.
Или кого-то напрягают лайфтаймы 'a ?
Кстати, а что означает «токенизация чтения» и какое отношение имеет это к человеческому восприятию текста? Или кто-то читает программы посимвольно, как это делает компилятор?

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

Я не понимаю, а чем вышеприведённый код сложен в восприятии?

Вытянут в одну длинную макаронину. Даже просто разбиение на несколько строк повысило бы читабельность.

tailgunner ★★★★★
()

какой же у руста всетаки ужасный синтаксис /o

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

Я не понимаю, а чем вышеприведённый код сложен в восприятии?

Токенизация, плохо совместимая с особенностями человеческого восприятия.

Кстати, а что означает «токенизация чтения» и какое отношение имеет это к человеческому восприятию текста?

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

Или кто-то читает программы посимвольно, как это делает компилятор?

Вот избытки однотипных закорючек и заставляют читать программы посимвольно. Конечно, мозг штука мощная и способен научиться читать крупными токенами хоть brainfuck, но это — лишнее и часто значительное время на освоение и всё равно снижение скорости восприятия.

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

А подсвеченный вариант как тебе?

http://s31.postimg.org/ehnsvt6kr/Screenshot_from_2016_04_23_15_19_22.png

(Хотел сделать ссылкой на pastebin, но у того тоже сломался парсер на ')

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

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

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

Вы бы хоть пример какой привели. Вот этот код читаемый?

if [ ! -z "`ps -C \`basename $0\` --no-headers -o "pid,ppid,sid,comm"|grep -v "$$ "|grep -v "<defunct>"`" ]; then

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

Ну не знаю, я четко вижу во второй строке map->iter->filter->map и вполне очевидные лямбды меж ними, в которые можно не вникать.

А вот в первой строке vim-подсветчик налажал (или я чего-то не понимаю): Vec подсветил, а HashMap нет. В итоге визуально получилось 3 аргумента вместо двух )

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

Вот этот код читаемый?

Плохо читаемый. Но, на мой взгляд, чуть лучше, чем топикстартовый :)

Тут токены отделяются друг от друга более чётко, но картину портит экранированная вложенность кавычек. Вариант с $(...) будет более читаемым.

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

ыфкуил

О, и гуманитариев есть свой хаскель )

makoven ★★★★★
()

Синтаксис Rust'а слегка нечитаем очень сильно.

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

Rust, пока похож на такой же w/o, как Perl (на котором я, кстати, дофига писал в прошлом и пописываю сейчас), Ruby или упомянутый в теме Haskell.

Haskell? w/o? Сразу видно умудрёного опытом человека.

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

Ну, это, как бы основы психофизиологии распознавания.

Ох лол.
Ладно, не буду дальше расспрашивать.
Иначе досмеюсь до икоты.

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

не выглядят как нечто открывающее и закрывающее.

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

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

может хватит уже необъективно обсирать все что не пхп?

Пытаюсь тут обмазаться ржавчиной. (комментарий)

PHP в плане читаемости исходника имеет тот же уровень, что Java или Си/Си++. Которые я в этой теме защищаю. Так что попытка наброса провалилась :)

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