我试图通过阅读原始规范来围绕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
发挥thread
API 的重要作用.但是,它们也包括在内libcore
.在后者中,有一些类型可以实现它们,但我找不到任何"消费者",也就是说,某些API会将这些特征用作边界.
它们是否具有编译器所知道的特殊行为/含义?请注意,它们是lang项目,所以它们在某种程度上是特殊的.Sync
似乎与静力学有关,但这个链接并没有详细说明.
TL; DR:如果Send
并且Sync
是关于线程安全的话,它们在libcore
没有多线程概念的地方会发挥什么作用?编译器将它们作为lang项分配给什么语义?