【问题标题】:Why does an unitialized typed variable in Dart not implement the type's interface?为什么 Dart 中未初始化的类型变量不实现类型接口?
【发布时间】:2020-04-13 00:31:07
【问题描述】:

我开始学习 Dart 并在此处阅读了对其中一些设计选择的评论:https://medium.com/@krossovochkin/dart-language-bad-design-choices-6e35987dc693

最后一点是关于糟糕的类型系统,作者引用了这段代码 sn-p 打印null

void main() {
  String s = null;
  if (s is String) {
    print("string");
  } else if (s is Null) {
    print("null");
  } else {
    print ("none");
  }
}

is 关键字对我来说是新的,但 Gilad 的“Dart 编程语言”指出is 检查对象类实现的接口,而不是对象的实际类。

但这对我没有多大帮助,因为我认为变量sString 的一个实例,因此实现了String,但证据恰恰相反。

我知道在 Dart 中定义对象/变量时不需要类,因此我开始怀疑将类放入定义中是否只是作为糖而没有什么功能用途。但相反,对象/变量的类完全由它的值决定,并且由于 Dart 中所有变量的默认值是 null,那么 String 没有实现是有意义的,但 Null 是。是这样吗?我是基地吗?也许有人可以帮我解决这个问题。

【问题讨论】:

    标签: dart


    【解决方案1】:

    原因是is检查的是当前对象本身的接口,而不是对该对象的引用。所以是的,s 可以指向一个 String 对象,但也允许指向 null,它是 Null 的一个实例:https://api.dart.dev/stable/2.7.2/dart-core/Null-class.html

    由于Null 没有实现String 接口,这将返回错误(null is String)。文章中也提到了这一点。

    本文试图关注的问题更多是允许您将String 变量设置为null 值,但Null 没有实现String

    好吧,在未来,这个问题将通过目前正在开发的不可空类型来解决。实现此功能后,您实际上可以定义变量,您可以确保值永远不会是null

    【讨论】:

    • 啊,我明白了,这对我来说很清楚。我检查实际value 接口的理论并非完全不正确。谢谢。
    【解决方案2】:

    所以我继续阅读 Dart 并获得了更好的理解,那就是 Dart 确实是可选类型的,这意味着两件事:

    1. 类型在语法上是可选的。
    2. 类型对运行时语义没有影响。

    因此,Dart 中变量的实际类型注释仅用于文档目的,不能假设类型注释为真。变量的实际类型完全由存储在该变量中的值决定,在本例中为null

    事实上,我在示例中定义的变量不是String 变量或String 接口的实现者。只是注释它可能/应该/最有可能是一个字符串。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-02-19
      • 1970-01-01
      • 1970-01-01
      • 2021-03-09
      • 2019-02-26
      • 2019-06-13
      • 2014-06-09
      • 1970-01-01
      相关资源
      最近更新 更多