Ответ 1
Dart не имеет понятия пространств имен, но вместо этого он имеет библиотеки. Вы можете считать библиотеку своего рода эквивалентом пространства имен, поскольку библиотека может быть сделана из нескольких файлов и содержать несколько классов и функций.
Конфиденциальность в Dart также находится в библиотеке, а не уровне класса (все, что префикс с подчеркиванием является приватным для этой библиотеки).
Пример определения библиотеки (на примере библиотеки утилит:
// utilities.dart
library utilities; // being the first statement in the library file
Вы можете сделать другие файлы частью одной и той же библиотеки, используя ключевое слово part
. Файлы деталей используются только для организации вашего кода; вы можете поместить все свои классы в один файл библиотеки или разделить их между несколькими файлами частей (или файлами частей и файлом библиотеки) - это не влияет на выполнение. Это стилистика, чтобы поместить основной файл библиотеки в родительскую папку и файлы деталей в папку src/
.
Развертывание примера для отображения файлов деталей.
// utilities.dart
library utilities;
part "src/string_utils.dart";
part "src/date_utils.dart";
Эти файлы частей затем ссылаются на библиотеку, в которой они входят, с помощью инструкции part of
:
// src/string_utils.dart
part of utilities;
// functions and classes
String reverseString(s) => // implementation ....
String _stringBuilder(strings) => // a private (to the library) function,
// indicated by the leading underscore
//... snip other classes and functions
Теперь, когда у вас есть библиотека, содержащая функцию, вы можете использовать эту библиотеку в другом месте import
для библиотеки:
// my_app.dart;
import "path/to/library/utilities.dart";
main() {
var reversed = reverseString("Foo");
// _stringBulider(["a","b"]); // won't work - this function is
// only visible inside the library
}
Если вы хотите использовать псевдоним вашей библиотеки, чтобы избежать столкновений (там, где вы могли бы импортировать две библиотеки, содержащие функцию reverseString()
, используйте ключевое слово as
:
// my_app.dart;
import "path/to/library/utilities.dart";
import "some/other/utilities.dart" as your_utils;
main() {
var reversed = reverseString("Foo");
var your_reversed_string = your_utils.reverseString("Bar");
}
В заявлении import также используются пакеты, импортированные пабом, диспетчер пакетов Dart, поэтому вы также можете разместить свою библиотеку в github или в другом месте и ссылаться на свою библиотеку следующим образом:
// my_app.dart;
import "package:utilities/utilities.dart";
main() {
var reversed = reverseString("Foo");
}
Зависимость pub определяется в файле pubspec.yaml
, который сообщает pub, где можно найти библиотеку. Вы можете узнать больше на pub.dartlang.org
Важно отметить, что только файл библиотеки может:
- содержат инструкции
import
. Файлы деталей не могут. - содержит ключевое слово
library
. Файлы деталей не могут. - содержат
part
файлы. Файлы деталей не могут.
Конечным моментом является то, что исполняемый файл приложения может (и, вероятно, быть) файлом библиотеки, а также может быть сделан из файлов деталей
// my_app.dart;
library my_app;
import "package:utilities/utilities.dart";
part "src/edit_ui.dart";
part "src/list_ui.dart";
part "src/foo.dart";
main() {
var reversed = reverseString("Foo");
showEditUi(); // perhaps defined in edit_ui.dart....?
}