小编rvi*_*dal的帖子

ES6中块级函数的精确语义是什么?

我试图通过阅读原始规范来围绕ES6中新的标准化块级功能.我的肤浅理解是:

  • 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)

javascript formal-semantics ecmascript-6

19
推荐指数
1
解决办法
5031
查看次数

匹配表达落下?

更新:这是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输出.为什么会这样?第二个分支不应该先匹配吗?

pattern-matching rust

11
推荐指数
1
解决办法
103
查看次数

宏可以扩展为模式的组合吗?

从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)

macros pattern-matching rust

6
推荐指数
2
解决办法
403
查看次数

在libcore中发送和同步的作用是什么?

Sync并从标准库中Send发挥threadAPI 的重要作用.但是,它们也包括在内libcore.在后者中,有一些类型可以实现它们,但我找不到任何"消费者",也就是说,某些API会将这些特征用作边界.

它们是否具有编译器所知道的特殊行为/含义?请注意,它们是lang项目,所以它们在某种程度上是特殊的.Sync似乎与静力学有关,但这个链接并没有详细说明.

TL; DR:如果Send并且Sync是关于线程安全的话,它们在libcore没有多线程概念的地方会发挥什么作用?编译器将它们作为lang项分配给什么语义?

intrinsics rust

0
推荐指数
1
解决办法
156
查看次数