借用Rust中元组内的一个拥有的盒子

时间:2014-04-18 16:50:49

标签: rust borrowing

主要目标是访问元组内部的拥有框,例如下面代码中(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, _)`

3 个答案:

答案 0 :(得分:4)

ref关键字用于通过引用绑定。

let (ref st_r, i) = st;

答案 1 :(得分:2)

我认为最直接的方式是匹配:

let st = (~"blub", 1i);
let (st_r, i) = match st {
    (ref s, i) => (s.as_slice(), i)
};
println!("{} {}", st_r, i);

请注意,由于两个原因,我使用了ref ss.as_slice()而不是s&*s。首先,由于&*s类型的当前特殊状态,不允许~str。当DST改变土地时,似乎有可能。其次,我使用ref s,因为否则第一个元组组件被移动到s,并且根本无法从match体内返回对它的引用 - 它将会match结束时被销毁。

i没有此类问题,因为int可隐式复制。

答案 2 :(得分:0)

如果您只关心元组的单个值,您还可以使用数字访问器(.0.1等)。这些可以应用参考运算符&

let st = ("blub".to_string(), 1);
let st_r = &st.0;