2016-12-22 2 views
3

Я начинаю ржавчину, и я не могу решить проблему этого типа. Я попытался заменить &name на name, но ошибка «шаблон &_ не покрыт».Как совместить с & 'статической str в Rust

fn get_project(name: &'static str) { 
    match &name { 
     "hi" => {}, 
    } 
} 

fn main() { 
    let project = get_project("hi"); 
} 

Compiler ошибка:

error[E0308]: mismatched types 
--> <anon>:3:9 
    | 
3 |   "hi" => {}, 
    |   ^^^^ expected &str, found str 
    | 
    = note: expected type `&&str` 
    = note: found type `&'static str` 
+0

http://stackoverflow.com/questions/25383488/how-to-match-a-string-against-string -literals-in-rust – Stargateur

+0

Я видел, но не могу решить свою проблему – maku

ответ

3

В вашем примере, name не нужно иметь static жизни. Поскольку в вашей функции используется только name, name не требует расширенного срока службы. Проверьте strings chapterЯзык программирования ржавчины. Чтобы соответствовать &str с &'static str, вам не нужно &, достаточно просто переменной.

pub fn get_project(name: &str) { 
    match name { 
     "hi" => println!("I found hi!"), 
     _ => println!("Nothing match"), 
    } 
} 

fn main() { 
    get_project("hi"); 
    get_project("42"); 
} 
+0

Это может сработать, спасибо. – maku

+0

@LukasKalbertodt Спасибо, я новичок в ржавчине. Ваш ответ был очень ясен. Я исправляю, как мог. – Stargateur

+0

@Stargateur Я уже видел ваше исправление, мой комментарий ушел ;-) И добро пожаловать в Rust, надеюсь, вам понравится ваше пребывание^_ ^ –

6

Строковые литералы - как "hi" - имеют тип &'static str. Так что, если у вас уже есть &str, вам не нужно, чтобы добавить &:

fn get_project(name: &str) { 
    match name { 
     "hi" => {}, 
     _ => {}, // matches have to be exhaustive 
    } 
} 

Я также добавил случай в по умолчанию, потому что матчи в Rust должны быть исчерпывающими: они должны охватывать все возможные случаи ,


Может быть, вы заметили, что я удалил 'static из списка аргументов. Если вы хотите прочитать о некоторых вещах на всю жизнь, продолжайте. Остальное, перестаньте читать здесь, потому что это, возможно, запутанно и не так важно в этом случае.

В этой функции нет необходимости ограничивать время жизни данного аргумента 'static. Может быть, вы хотите передать в строковых кусочки, которые заимствованных из String:

let user_input = read_user_input(); // type `String` 
get_project(&input); 

Код выше работает только при удалении 'static от аргумента. После удаления, функция эквивалентна:

fn get_project<'a>(name: &'a str) { ... } 

Это означает, что функция является общей в течение всей жизни 'a. Функция говорит: при любой жизни 'a вы можете дать мне строку с указанным сроком службы, и я могу сделать свое дело. Что является правдой. Если функция не сможет сделать это на протяжении всей жизни, компилятор будет жаловаться ;-)

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