ржавчина по примеру: закрытие итератора любой дает E0308 - PullRequest
0 голосов
/ 02 ноября 2019

Я пробовал код книги "Rust by Example", но поставлен в тупик на https://doc.rust -lang.org / stable / rust-by-example / fn / closures / closure_examples / iter_any.html

error[E0308]: mismatched types
  --> Function.rs:81:95
81 |         fn any < F >  ( & mut self , mut f: F ) -> bool where F: FnMut ( Self::Item ) -> bool {}
   |                                                                                               ^^ expected bool, found ()

Полный фрагмент кода, который я использую:

fn closure_iterator_any ( v1a: i32 , v1b: i32 , v1c: i32 , v2a: i32 , v2b: i32 , v2c: i32 )
  {
    pub trait Iterator
      {
        type Item ; // type of item being iterated over
        fn any < F >  ( & mut self , mut f: F ) -> bool where F: FnMut ( Self::Item ) -> bool {}
      }
    let vec1 = vec! [ v1a , v1b , v1c ] ;
    let vec2 = vec! [ v2a , v2b , v2c ] ;
    println! ( "2 in vector 1: {}" , vec1 . iter () . any ( |&x| x == 2 ) ) ; // iter returns &i32
    println! ( "2 in vector 2: {}" , vec2 . into_iter () . any ( |x| x == 2 ) ) ; // into returns i32

    let array1 = [ v1a , v1b , v1c ] ;
    let array2 = [ v2a , v2b , v2c ] ;
    println! ( "2 in array 1: {}" , array1 . iter () . any ( |&x| x == 2 ) ) ;
    println! ( "2 in array 2: {}" , array2 . into_iter () . any ( |&x| x == 2 ) ) ;

  }

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

1 Ответ

2 голосов
/ 02 ноября 2019

В этом примере деталь с чертой

pub trait Iterator {
    // The type being iterated over.
    type Item;

    // `any` takes `&mut self` meaning the caller may be borrowed
    // and modified, but not consumed.
    fn any<F>(&mut self, f: F) -> bool
    where
        // `FnMut` meaning any captured variable may at most be
        // modified, not consumed. `Self::Item` states it takes
        // arguments to the closure by value.
        F: FnMut(Self::Item) -> bool,
    {}
}

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

Конкретная ошибка заключается в том, что any должен вернуть bool, но сейчас он возвращает ()(тип объекта, который имеет уникальный элемент). Причина этого кроется в маленьком {} ближе к концу. На самом деле это пустое тело функции, которое неявно возвращает (), если у него нет оператора возврата или чего-либо еще, что могло бы вернуть.

Если вы просто хотите сделать пример компиляции, вы можете просто удалитьэтот кусок (весь блок pub trait ...), поскольку он не является частью примера. Даже если вы исправите это и сохраните его, any, используемый в остальной части примера, в любом случае будет не таким, а методом any, определенным для реальной черты Iterator в стандартной библиотеке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...