【问题标题】:Why `final var` is illegal in Dart?为什么`final var`在 Dart 中是非法的?
【发布时间】:2014-04-17 15:54:37
【问题描述】:

分析器没有说final var 是非法的。 但是 dart2js 说 final var 是非法的

什么是正确的?为什么?

【问题讨论】:

    标签: dart dart2js


    【解决方案1】:

    这可能是分析器中的一个错误。 finalvar 是互斥的。

    允许以下之一

    • 最终标识符
    • 最终类型标识符
    • 常量标识符
    • 常量类型标识符
    • 变量标识符
    • 类型标识符

    Dart Programming Language Specification (1.2) - Variables

    finalConstVarOrType:
       final type?
       | const type?
       | varOrType
       ;
    varOrType:
       var
       | type
       ;
    

    编辑

    我的 DartEditor(Dart VM 版本:1.3.0-dev.3.2(2014 年 3 月 10 日星期一 10:15:05)在“linux_x64”上显示final var xxx 的错误(不能将成员声明为两者) final' 和 'var'。)

    【讨论】:

    • 是的,谢谢您回答这个问题,善良的@Günter Zöchbauer :) 顺便说一句,我不明白为什么规范不允许var。也许,类型在编译时不固定?
    • @sunglim var 指定该字段允许任何类型,但如果该字段是 final 它只能有一种类型 - 它被初始化的值的类型,因此这两个关键字冲突彼此(只是我的看法,我对所发生的决策过程没有特别的见解)
    • @sunglim 这要容易得多。关键字var 表示可变变量。关键字final 表示val,不可变变量,或者只是一个不是const 值但它也不是可变的值。不是const,因为它有runtime storage,但同时这只是一个存储的不可变value。现在考虑这段代码:final var foo 这与val var foo 相同。如您所见,这是不可能立即将变量声明为可变和不可变的。
    【解决方案2】:

    关键字var 表示具有显式dynamic 类型说明符的可变变量。 显式类型说明符意味着这不可能在声明中指定另一种类型。

    关键字final 表示val 或具有未指定类型的不可变变量,具有隐式dynamic 类型。 隐式类型说明符意味着可以在声明中指定其他类型。

    更准确地说,声明为val 的变量是valuevariable

    它是可变的,因为有runtime storage

    但它也是immutable value,可以从关联存储中检索一次,并且可以在任何地方使用。

    现在考虑以下代码:

    final var foo;
    

    这与下面的伪代码相同:

    immutable mutable dynamic foo;
    

    当然,这是行不通的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-19
      • 2020-01-27
      • 1970-01-01
      • 2018-10-30
      相关资源
      最近更新 更多