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)
Ответ на: комментарий от makoven

И это всё в одном проекте?)

Нет, конечно. Я же писал, что выбор языка должен диктоваться задачей. Задачи разные — языки тоже. Поэтому Web-морду я пишу на PHP+JS, быстрый бэкенд-сервис на Go, embedded-скрипт для ESP8266 на Lua, а всякие консольные приблуды — на Bash с Perl.

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

Просто у них скобки закончились.

Вы, главное, разработчикам Rust'а не показывайте APL :)

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

мне одному пример на джавке кажется симпатичней?

Да.

fn filter(map: &HashMap<String, bool>) -> Vec<&String> {
    let filter_fn = |(k, &v)| if v { Some(k) } else { None };
    
    map.iter().filter_map(filter_fn).collect()
}
anonymous
()
Ответ на: комментарий от tailgunner

Напиши красиво. На любом языке по твоему выбору.

def myCollect(m: Map[String, Boolean], b: mutable.Buffer[String]): Unit =
   b ++= (m collect { case (k, true) => k })

Хотя я бы предпочёл

def myCollect(m: Map[String, Boolean]): Seq[String] =
    m collect { case(k, true) => k } toSeq

А вообще, это настолько мелкая фигня, что выноса в отдельную функцию и не требует.

Zenom ★★★
()
Последнее исправление: Zenom (всего исправлений: 1)
Ответ на: комментарий от anonymous
f = keys . filter id

Кто там вин агейн, да еще и с макросами? Хотя фэйл говорящему «Динамически типизированное убожество» тоже засчитываю.

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

Динамически типизированное убожество.

Лисперы пишут на литературном английском, им спеллчекера хватает.

anonymous
()
Ответ на: комментарий от Ivana
f = keys . filter id

Объясни, как это работает.

У лисперов формулировка задачи на литературном английском. Ничего красивее быть не может.

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

У лисперов красота, согласен, сам пару лиспов написал (один на хаскеле). Но в хаскеле вообще неземная красота (зачастую нечеловеческая, да). работает это так - f это функция, аргумент которой опущен в силу эта-редукции (эта - буква такая). Тело функции является композицией (оператор точка) двух функций - фильтра с аргументом - булевским предикатом, возвращающем тру когда надо (у нас булевские значения в мапе, поэтому просто функция а = а, которая зовется id) и библиотечной функции keys, которая собирает ключи мапа в список. ЗЫ и это самая тривиальщина в хаскеле, неземная красота начинается дальше.

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

Только у лисперов красота скомпилится, а у функциональщиков будет тормозить по-нечеловечески.

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

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

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

С каких это пор лисперы не функциональщики? О_о

А вообще, я правильно понял, что Вы утверждаете, что код на лиспе будет ощутимо быстрее аналогичного на Хаскеле?

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

В общем случае - чужь.

В общем случае функциональщики сосут в compile-time metaprogramming. А значит вся эта «неземная красота» будет крутится в рантайме.

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

С каких это пор лисперы не функциональщики? О_о

Лисперы — язычники. Вместо объектов и функций предпочитают писать языки.

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

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

Кстати, свое мнение ты обосновать не потрудился.

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

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

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

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

Всё, что понимает компилятор, он переводит в эффективный машкод. А про «общие случаи», которые существуют в твоем воображении, говорить бессмысленно.

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

Всё, что понимает компилятор, он переводит в эффективный машкод.

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

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

Навскидку, этот однострочник из трех слов на обычном (не интовом, не строгом, ленивом) мапе размером 1Е7 отрабатывает 1.873 сек. Чтобы ленивый результат-список зафорсился, считаю его длину.

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

На интовом мапе того же размера со всеми значениями тру - 1.32 сек, с половиной трушных значений - 0.75 сек. Но оптимизатор я неважный, может настоящие сварщики и получше цифры получат.

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

В том-то и дело, что красоту, то есть язык задачи, компилятор не понимает

А компилятор вообще понимает только входной язык. Любой компилятор.

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

Макросистема макросистеме рознь.

И компилятор компилятору. И язык задачи языку задачи.

tailgunner ★★★★★
()

Шел третий день изучения раста. Читаю пятую статью лайфтаймы. Не врубаюсь. Я сильно тупой?)

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

Забей. Я сам нихера не понимаю, но компилятор подскажет.
В этом отношении у Раста очень умный компилер.

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

Не, забить не получится. Было бы интересно увидеть пример, где для структуры или функции требуются 2 лайфтайма. Вообще не понятно как это

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

Вот, например http://is.gd/wcj0Vt

fn first<`a, `b>(slice: &`b[&`a u32]) -> Option<&`a u32> {
    if slice.len() == 0 {
        None
    } else {
        Some(slice[0])
    }
}

fn main() {
    let a = 1;
    let ra = first(&[&a]);
    println!("First: {:?}", ra);
}
Если написать &'a[&'a u32] вместо &'b[&'a u32], то работать не будет, потому что слайс временного массива (&[&a]), передаваемого в функцию, живёт меньше чем ссылка на a, а &'a[&'a u32] требует чтобы время жизни было одинаковым.

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

Пример на Яве выглядит проще за счет того, что там вместо лямбд готовые функции.

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

Стало сложней?

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

Спасибо, так немножко понятней. Типа если аргумент - ссылочный тип, состоящий из других ссылок, то все эти ссылки могут иметь разный лайфтайм, т.к. они могут быть собраны из разных мест (блоков, контекстов).

А в этой конкретной ситуации какой прок для функции first знать лайфтаймы ссылок? Владеть и уничтожать она ничего не собирается.

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

Сигнатуру функции в Rust'е нужно явно указывать, в отличие от F# или Haskell'я (это решение было принято, чтобы изменение типов внутри одной функции не влияло на сигнатуры других функций). Поэтому и требуется указать какой лайфтайм будет у возвращаемого значения (там могут быть два варианта, поэтому компилятор не может использовать lifetime elision).

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

Было бы интересно увидеть пример, где для структуры или функции требуются 2 лайфтайма.

Про функции пример уже был, но со структурами ещё проще:

struct Data<'a, 'b> {
    val1: &'a str,
    val2: &'b str,
}
Если указать один лайфтайм, то и жить члены структуры должны одинаково, что не всегда удобно/возможно. Другое дело, что в большинстве случаев, будет удобнее если в структуре будут храниться не ссылки, то есть если она сама будет владеть значениями.

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

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

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

ну я привык к диким плюсам. и чо?

Ну есть тут один улыбчивый дурачок, который пишет на плюсах и ненавидит их. От этого у него съехала крыша, и его мнение ничего не стоит.

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

сремящийся к бесконечности с каждым релизом

И ты можешь как-то подтвердить свои слова и показать в чём синтаксис изменился в худшую сторону после 1.0?

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

Пеример, один хрен - адъ и израиль =)) и это еще не самый 3.14здец, который я видел.

Кажется у перла в плане writeOnly кода появился конкурент.

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