Dart中的external是什么意思?

65
在Dart中,“external”是一个修饰符,用于声明函数或成员变量不是在当前文件或库中实现,而是在另一个文件或库中实现。例如: external DateTime._now(); 表示 _now() 函数的实现在DateTime类的定义之外。
如果您想了解更多关于 Dart 的知识和技能,并且需要帮助,请访问Dart官方文档。

6
我找不到“external”的文档。请参考http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-408.pdf第9.4节。 - Michael
7个回答

63
9.4 外部函数 外部函数是指其函数体与声明分离的函数。外部函数可以是顶级函数(17)或方法。
该函数的函数体在其他地方定义。 据我所知,这是用于修复浏览器中Dart VM和服务器上Dart VM之间不同实现的问题。

2
它主要用于抽象Dart VM和dart2js之间的实现细节。 - Florian Loitsch
19
我如何找到外部方法的实现? - Nawaf Alsulami
11
我可以通过在源代码中搜索相关关键字来找到外部函数实现的文件位置。但是,如果我可以从编辑器内部访问这些实现,那将会更加方便。 - Nawaf Alsulami

26

当我们在类内创建像 toString() 这样的外部函数时

external String toString();

这意味着该方法是抽象的,父类的子类将会添加函数体,因为在Dart中我们只能创建抽象类。

总结:

外部函数 = 非抽象类中的抽象函数


9

我认为关键字external并不是用于将方法标记为抽象的,即使这是可能的。

只需在抽象类中留下没有实现的方法即可将其设置为抽象方法。

这相当于TypeScript中的declare和C#中的extern,它们用于与其他运行时的互操作性,这意味着您告诉编译器:“不要担心此方法的实现,我保证它将在运行时存在”,运行时可以是C、Javascript或任何其他语言。


6

如果你在想为什么或者在哪里应该使用external关键字,这里有一个Flutter的例子。

class MyStruct extends Struct {
  @Int32()
  external int a;

  @Float()
  external double b;

  external Pointer<Void> c;
}

有时候当你使用本地库(native libraries)时,会用到 Struct 来访问内存中的本地结构体字段,但不是经常这样做。在 Struct 中,我们必须将所有字段声明为external,因为这些字段将来自于 dart:ffi (C / C++)。

所以,external 不仅仅是声明 "抽象方法" 的方式。


5
9.4 外部函数 外部函数是指其函数体与声明分开提供的函数。
这意味着你定义了函数,但没有实现。它与定义抽象方法的方式完全相同,唯一的区别是使用外部函数时,你不在Dart中实现方法,而是在C或其他地方实现。
类似于String类,它可以被视为外部函数,只是String类标记为@pragma('vm:entry-point'),使整个类使用本机代码。
请参考以下示例以理解:
这是Dart端的代码。

https://github.com/dart-lang/sdk/blob/main/sdk/lib/core/string.dart#L711

这是C++的实现。

https://github.com/dart-lang/sdk/blob/main/runtime/lib/string.cc#L473-#L478


1
如果您提供一个来源,那将非常有帮助:9.4 外部函数 外部函数是指其函数体与声明分开提供的函数。 - Worik

2

在我看来,它相当于Java中的native关键字。例如,由于Android、iOS、Linux等系统对当前时间毫秒数的实现方式不同,DateTime.now().millisecondsSinceEpoch在运行时将链接到不同的实现。因此,最初不知道这个方法的具体形式。出于这个原因,它被标记为external,表示它是平台相关的。


1
Dart语言规范草案

外部函数是指其函数体与声明分开提供的函数。外部函数可以是顶级函数(19),方法(10.2,10.8),getter(10.3),setter(10.4)或非重定向构造函数(10.7.1,10.7.2)。外部函数通过内置标识符external(17.38)后跟函数签名来引入。

外部函数允许我们为Dart编译器无法静态知道的代码引入类型信息。

外部函数的示例可能是外部函数(在C或Javascript等中定义),实现的原语(由Dart运行时系统定义)或动态生成的代码,但其接口是静态已知的。然而,抽象方法与外部函数不同,因为它没有函数体。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接