Что это значит, когда «метод существует, но границы признаков не выполнены»? - PullRequest
1 голос
/ 24 мая 2019

Я новичок в Rust и обнаружил кое-что, против чего не могу аргументировать.

Когда я пишу

fn main() {
    ('a'..'z').all(|_| true);
}

Компилятор сообщает об ошибке:

error[E0599]: no method named `all` found for type `std::ops::Range<char>` in the current scope
 --> src/main.rs:2:16
  |
2 |     ('a'..'z').all(|_| true)
  |                ^^^
  |
  = note: the method `all` exists but the following trait bounds were not satisfied:
          `std::ops::Range<char> : std::iter::Iterator`

Когда я изменяю его на

fn main() {
    (b'a'..b'z').all(|_| true);
}

, он компилируется.

Что здесь происходит?Что означает Rust, когда он говорит the method ... exists but the following trait bounds were not satisfied?

Ответы [ 2 ]

4 голосов
/ 24 мая 2019

Метод all() является методом черты Iterator, поэтому его можно вызывать только для типов, которые реализуют эту черту.Тип Range<char> не реализует черту Iterator, поскольку диапазон общих символов Unicode в общем случае не является четко определенным.Набор допустимых кодовых точек Unicode имеет пробелы, и построение диапазона кодовых точек в общем случае не считается полезным.Тип Range<u8> с другой стороны реализует Iterator, поскольку итерации по диапазону байтов имеют четко определенное значение.

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

2 голосов
/ 24 мая 2019

Это означает, что в области видимости есть черта, в которой есть функция с этим именем, но используемый вами объект не реализует такую ​​черту.

В вашем конкретном случае эта чертасодержит all метод std::iter::Iterator, но ваш объект ('a'..'z') если тип Range<char> не реализует его.

Как ни странно, ваш второй пример компилируется, потому что (b'a'..b'z') имеет тип Range<u8>, который реализует Iterator.

Вы, вероятно, задаетесь вопросом, почему Range<char> не реализует итератор.Это потому, что между допустимыми значениями char есть недопустимые значения, поэтому эти диапазоны просто не могут быть повторены.В частности, допустимыми являются только символы в диапазонах [0x0, 0xD7FF] и [0xE000, 0x10FFFF], IIRC.

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