我试图通过阅读原始规范来围绕ES6中新的标准化块级功能.我的肤浅理解是:
然而,由于这些语义的一部分被指定为"可选的"并且仅对于Web浏览器是必需的(附件B),因此这进一步复杂化.所以我想填写下表:
| Visible outside of block? | Hoisted? Up to which point? | "TDZ"? |
------------------------------------------------------------------------------------------------------------------------
| Non-strict mode, no "web extensions" | | | |
| Strict mode, no "web extensions" | | | |
| Non strict mode, with "web extensions | | | |
| Strict mode, with "web extensions" | | | |
另外我不清楚在这种情况下"严格模式"是什么意思.这种区别似乎在附件B3.3中引入,作为函数声明的运行时执行的一些附加步骤的一部分:
1. If strict is false, then
...
Run Code Online (Sandbox Code Playgroud)
但是,据我所知,strict指[[Strict]]的是函数对象的内部插槽.这是否意味着:
// Non-strict …Run Code Online (Sandbox Code Playgroud) 更新:这是1.12中解决的旧bug
这是一些人为但简单的模式匹配示例(演示):
fn main() {
let x = 'a';
match x {
'a'...'b' if false => {
println!("one");
},
'a' => {
println!("two");
},
'a'...'b' => {
println!("three");
},
_ => panic!("what?")
}
}
Run Code Online (Sandbox Code Playgroud)
当我运行它时,我得到three输出.为什么会这样?第二个分支不应该先匹配吗?
从Rust 1.0开始,无法将多个模式分组到一个绑定中:
// It does not compile
match x as char {
b @ ('A' | 'Z') => println!("A or Z: {}", b),
_ => println!("Try again")
}
// Correct version
match x as char {
b @ 'A' | b @ 'Z' => println!("A or Z: {}", b),
_ => println!("Try again")
}
Run Code Online (Sandbox Code Playgroud)
我想知道宏是否可以完成绑定所有不同可能性的肮脏工作.以下是部分尝试:
macro_rules! bind_alternatives {
($x:ident, $e:expr) => ($x @ $e);
($x:ident, $e1:expr, $e2:expr) => (
$x @ $e1 | $x @ $e2
);
}
fn main() …Run Code Online (Sandbox Code Playgroud) Sync并从标准库中Send发挥threadAPI 的重要作用.但是,它们也包括在内libcore.在后者中,有一些类型可以实现它们,但我找不到任何"消费者",也就是说,某些API会将这些特征用作边界.
它们是否具有编译器所知道的特殊行为/含义?请注意,它们是lang项目,所以它们在某种程度上是特殊的.Sync似乎与静力学有关,但这个链接并没有详细说明.
TL; DR:如果Send并且Sync是关于线程安全的话,它们在libcore没有多线程概念的地方会发挥什么作用?编译器将它们作为lang项分配给什么语义?