Основная цель - доступ к принадлежащей коробке, которая находится внутри кортежа, например. строка из (String, i32)
в коде ниже.Заимствование из находящейся в собственности коробки внутри кортежа в ржавчине
Мое первое намерение состояло в том, чтобы использовать привязку let
для заимствования из принадлежащей мне коробки. Заимствование работает для случая не кортежа (1), но не при использовании кортежа (2).
Я намерен ошибаться, и если да, есть ли еще один идиоматический способ доступа к строке?
Пример кода:
fn main() {
// 1. Normal borrowing
let s: String = "blub".to_string();
let sr: &str = &s; // this works
// 2. Borrowing from a tuple
let st = ("blub".to_string(), 1);
let (st_r, i): (&str, i32) = st; // error: mismatched types:
println!("{} {} {} {}", s, sr, st_r, i);
}
Ошибка компилятора:
error: mismatched types:
expected `(&str, i32)`,
found `(collections::string::String, _)`
Обратите внимание, что когда вы это делаете, вы получаете 'st_r: & ~ str', а не' st_r: & str'. Вот почему 'as_slice()' необходимо в любом случае. Это можно проверить очень легко: 'println! (" {} ", St_r as int);' приводит к ошибке: нескалярный cast: & ~ str as int' –
Вызов 'as_slice()' определенно важный часть ответа. В моем коде я в конечном итоге использовал эквивалент, если 'let (ref st_r, i) = st; let st_r = st_r.as_slice() '. Упоминание «int» еще два раза в подходе к сопоставлению оказалось немного избыточным. – sim82