LINUX.ORG.RU

Сообщения No

 

Проблема с определением времени жизни/мутабельности

Есть программа

struct Page {
    content: i32,
}

struct Book<'a> {
    pages: Vec<Page>,
    bookmarks: Vec<&'a Page>,
}

fn main() {
    let mut book1 = Book {
        pages: Vec::new(),
        bookmarks: Vec::new(),
    };

    // добавление страниц
    book1.pages.push(Page { content: 42 });
    book1.pages.push(Page { content: 100500 });

    // добавление закладок
    book1.bookmarks.push(&book1.pages[0]);
    book1.bookmarks.push(&book1.pages[1]);

    println!("{}", book1.bookmarks[0].content);
}

которая запускается без ошибок, и печатает ожидаемый результат.

Каким образом можно определить такую функцию «add_bookmark», чтобы для добавления закладок, вместо операторов «book1.bookmarks.push(&book1.pages[0]);», можно было вызывать эту функцию «add_bookmark»?

В варианте

fn add_bookmark<'a>(book: &'a mut Book<'a>, page_no: usize) {
    book.bookmarks.push(&book.pages[page_no]);
}

возможен только один вызов

add_bookmark(&mut book1, 0);

Интересен вариант когда поле «bookmarks» хранит именно ссылки на страницы, а не номера страниц.

 

No
()

Замыкание как аргумент другого замыкания

Как в Rust можно определить функцию, аргументом которой является замыкание с аргументом-замыканием?

Вариант с динамической диспетчеризацией работает, но со статической компилятор сообщает об ошибке «the type of this value must be known in this context»:

fn dyn1(f: &Fn(i32)) {
}

fn dyn2(f: &Fn(&Fn(i32))) {
}

fn stat1<F: Fn(i32)>(f: F) {
}

// ???
fn stat2<F: Fn(i32), F2: Fn(F)>(f: F2) {
}

fn main() {
    // x - целое число, динамическая диспетчеризация
    dyn1(&|x| { });

    // fx - замыкание с целым аргументом, динамическая диспетчеризация
    dyn2(&|fx| {fx(1)});

    // x - целое число, статическая диспетчеризация
    stat1(|x| { });

    // fx - замыкание с целым аргументом, статическая диспетчеризация
    stat2(|fx| {fx(1)}); // ошибка: the type of this value must be known in this context
}

 

No
()

RSS подписка на новые темы