2015-10-28 2 views
1

Мне было интересно, можно ли возвращать разные типы в зависимости от условий в функции: Этот код будет работать, если вы удалите '|| bool 'и' if/else '.Может ли функция возвращать разные типы в зависимости от условных операторов в функции?

Заранее спасибо.

fn main() { 
    let vector: Vec<i32> = vec![0, 2, 5, 8, 9]; 
    let targetL i32 = 3; 
    let found_item = linear_search(vector, target); 
    println!("{}", &found_item); 
} 
fn linear_search(vector: Vec<i32>, target: i32) -> i32 || bool { 
    let mut found: i32 = 0; 
    for item in vector { 
     if item == target { 
      found = item; 
      break 
     } 
    } 
    if found == 0 { 
     false 
    } else { 
     found 
    } 
} 

ответ

5

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

Однако, вы можете сделать вы пытались сделать, путем оборачивания типов в общий перечисление (который заменяет || в коде):

enum TypeOr<S, T> { 
    Left(S), 
    Right(T), 
} 

fn linear_search(vector: ...) -> TypeOr<i32, bool> { //... 

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

Это, по существу, обобщенная версия обычно используемых типов Option и Result.

Edit: На самом деле, в вашем случае, вы служили очень хорошо по семантике Option типа: вы никогда не вернетесь true, так что вы можете приравнять None результат с false результат вашего возвращения функции, и это захватывает идея, которую вы пытаетесь выразить: либо ваш линейный поиск находит цель и возвращает ее (Some(found)), либо нет, и нечего возвращать (None).

+0

Благодарим вас обоих, в этом случае опция выглядит чище, но если я понимаю это правильно: с перечислением у вас есть больше опций – user3419211

+4

@ user3419211 в вашем случае вы обязательно должны использовать 'Option'. Необработанное перечисление имеет больше опций (и может быть вложенным и т. Д.), Но «Option» находится в стандартной библиотеке, и он использует их точно в соответствии с вашим прецедентом. –