从Rust中元组内的自有盒子中借用

从Rust中元组内的自有盒子中借用,rust,borrowing,Rust,Borrowing,主要目标是访问元组中的自有框,例如字符串中的字符串,下面代码中的i32 我的第一个意图是使用出租装订从自有箱子中借用。借用适用于非元组情况1,但不适用于涉及元组的情况2 我的意图是错误的吗?如果是的话,还有其他惯用的方法来访问字符串吗 示例代码: fn main() { // 1. Normal borrowing let s: String = "blub".to_string(); let sr: &str = &s; // this works

主要目标是访问元组中的自有框,例如字符串中的字符串,下面代码中的i32

我的第一个意图是使用出租装订从自有箱子中借用。借用适用于非元组情况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, _)`

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

let st = (~"blub", 1i);
let (st_r, i) = match st {
    (ref s, i) => (s.as_slice(), i)
};
println!("{} {}", st_r, i);
注意,我使用ref s和s.as_slice代替s或&*s有两个原因。首先,&*s是不允许的,因为当前处于~str类型的特殊状态。当DST改变土地时,这似乎是可能的。第二,我使用了ref s,因为否则第一个元组组件将被移动到s中,并且根本不可能从匹配体内部返回对它的引用——当匹配结束时,它将被销毁


i没有这样的问题,因为int是隐式可复制的。

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

let st = (~"blub", 1i);
let (st_r, i) = match st {
    (ref s, i) => (s.as_slice(), i)
};
println!("{} {}", st_r, i);
注意,我使用ref s和s.as_slice代替s或&*s有两个原因。首先,&*s是不允许的,因为当前处于~str类型的特殊状态。当DST改变土地时,这似乎是可能的。第二,我使用了ref s,因为否则第一个元组组件将被移动到s中,并且根本不可能从匹配体内部返回对它的引用——当匹配结束时,它将被销毁

i没有这样的问题,因为int是隐式可复制的。

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

let (ref st_r, i) = st;
ref关键字用于通过引用绑定

let (ref st_r, i) = st;

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

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

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

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

注意,当您这样做时,您得到的是st_r:&~str,而不是st_r:&str。这就是为什么无论如何都需要as_切片。这很容易检查:println!{},st_r as int;导致错误:非标量cast:&~str as intas_slice调用肯定是答案的一个重要部分。在我的代码中,我最终使用了等价的if let ref st_r,I=st;让st_r=st_r.as_切片。在匹配方法中另外两次提到int感觉有点多余。请注意,当您这样做时,您得到的是st_r:&~str,而不是st_r:&str。这就是无论如何都需要as_切片的原因。这很容易检查:println!{},st_r as int;导致错误:非标量cast:&~str as intas_slice调用肯定是答案的一个重要部分。在我的代码中,我最终使用了等价的if let ref st_r,I=st;让st_r=st_r.as_切片。在匹配方法中另外两次提到int感觉有点多余。您可能应该为Rust 1.0及以上版本更新此问题。您可能应该为Rust 1.0及以上版本更新此问题。