パターンマッチとderef
以下のような段階を踏む必要がある。sliceと Vec とかも同様。
code:rust
use std::rc::Rc;
struct Data(String); // 適当なnon-copiableなデータ型
struct A<'a>(&'a Data);
struct B(Rc<Data>);
fn main() {
let data = Data("hello".to_string());
match A(&data) {
A(& Data(ref s)) => println!("{}", s)
}
match B(Rc::new(data)) {
B(ref rc) => match **rc {
Data(ref s) => println!("{}", s)
},
// こうは書けない
// B(& Data(ref s)) => println!("{}", s)
}
let some_string = "foo".to_string();
match &*some_string { "foo" => println!("A"), _ => println!("B") }
// こうは書けない
// match some_string { "foo" => println!("A"), _ => println!("B") }
}