2016-01-13 6 views
0

Я пытаюсь написать функцию, которая возвращает минимальное число из массива:Что не так с моей функцией min?

Определение функции:

pub fn min(input_array: &[i32]) -> &i32 { 
    let x = input_array.iter().min().unwrap(); 
    x 
} 

Тест:

fn test_min() { 
    let input_array = [1, 2, 3, 4]; 
    assert_eq!(1, functional::min(&input_array)); 
} 

Но когда я запускаю его я получаю сообщение об ошибке :

<std macros>:5:8: 5:33 error: the trait `core::cmp::PartialEq<&i32>` is not implemented for the type `_` [E0277] 
<std macros>:5 if ! (* left_val == * right_val) { 
         ^~~~~~~~~~~~~~~~~~~~~~~~~ 
src/functional.rs:104:5: 104:50 note: in this expansion of assert_eq! (defined in <std macros>) 
<std macros>:5:8: 5:33 help: run `rustc --explain E0277` to see a detailed explanation 
error: aborting due to previous error 
Could not compile `gettingrusty`. 
+0

Проверьте тип 'x' с' пусть _:() = х; ', скорее всего, его тип' & i32', и я уверен, что вы можете взять его отсюда. –

+0

Вы уверены, что это ошибка? 'min' возвращает' Option '... Я предполагаю, что вы разворачиваете это и не включаете его в свой фрагмент? –

+0

Извините, добавил недостающие разделы. –

ответ

4

Ваш min в порядке (при условии, что вы хотите вернуть &i32), ошибка находится в assert. Это правильно:

assert_eq!(&1, min(&input_array)); 
+0

Что означает «& 1»? –

+0

@LowKianSeong Ссылка на временное значение 1. Ваш 'min' возвращает ссылку, поэтому вам нужно сравнить это с другой ссылкой. '& 1' является ссылкой, и он работает,' 1' сам по себе не является 'и i32' является' i32', поэтому он не компилируется. – eulerdisk

+0

Еще одно возможное решение - не возвращать ссылку: change '-> & i32' to' -> i32', а второй 'x' -' * x'. –

Смежные вопросы