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