Rust具有这种Any特性,但它也有"不支付你不使用的"政策.Rust如何实现反射?
我的猜测是Rust使用了懒惰标记.每个类型最初都是未分配的,但是稍后如果将类型的实例传递给期望Any特征的函数,则为该类型分配一个TypeId.
或者Rust TypeId可能会在其实例可能传递给该函数的每种类型上放置一个?我想前者会很贵.
以下代码(游乐场)
let max_column = 7;
edge = match current_column {
0 => Edge::Left,
max_column => Edge::Right,
_ => Edge::NotAnEdge
};
Run Code Online (Sandbox Code Playgroud)
导致以下错误:
warning: unreachable pattern
--> src/main.rs:10:9
|
9 | max_column => Edge::Right,
| ---------- matches any value
10 | _ => Edge::NotAnEdge
| ^ unreachable pattern
|
= note: #[warn(unreachable_patterns)] on by default
Run Code Online (Sandbox Code Playgroud)
max_column用文字替换变量可以正常工作:
let max_column = 7;
edge = match current_column {
0 => Edge::Left,
7 => Edge::Right,
_ => Edge::NotAnEdge
};
Run Code Online (Sandbox Code Playgroud)
为什么_在第一个示例中无法访问任何值current_column …
match该表达式是如何在高层次上实现的?编译器在幕后发生了什么才能知道如何将某些代码片段定向到一个分支与另一个分支,并在编译时弄清楚它?我不明白如果不存储运行时使用的类型信息,这怎么可能。
像这个例子:
\nfn tree_weight_v1(t: BinaryTree) -> i32 {\n match t {\n BinaryTree::Leaf(payload) => payload,\n BinaryTree::Node(left, payload, right) => {\n tree_weight_v1(*left) + payload + tree_weight_v1(*right)\n }\n }\n}\n\n/// Returns tree that Looks like:\n///\n/// +----(4)---+\n/// | |\n/// +-(2)-+ [5]\n/// | | \n/// [1] [3]\n///\nfn sample_tree() -> BinaryTree {\n let l1 = Box::new(BinaryTree::Leaf(1));\n let l3 = Box::new(BinaryTree::Leaf(3));\n let n2 = Box::new(BinaryTree::Node(l1, 2, l3));\n let l5 = Box::new(BinaryTree::Leaf(5));\n\n BinaryTree::Node(n2, 4, l5)\n}\n\n#[test]\nfn tree_demo_1() {\n let tree = sample_tree();\n assert_eq!(tree_weight_v1(tree), (1 …Run Code Online (Sandbox Code Playgroud)