Дартс Программирование — Обзор
Dart — это объектно-ориентированный язык с синтаксисом в стиле C, который может быть преобразован в JavaScript. Он поддерживает разнообразные средства программирования, такие как интерфейсы, классы, коллекции, универсальные шаблоны и необязательная типизация.
Дарт может широко использоваться для создания одностраничных приложений. Одностраничные приложения применяются только к веб-сайтам и веб-приложениям. Одностраничные приложения обеспечивают навигацию между различными экранами веб-сайта без загрузки другой веб-страницы в браузере. Классическим примером является GMail ─ когда вы нажимаете на сообщение в папке входящих сообщений, браузер остается на той же веб-странице, но код JavaScript скрывает папку входящих сообщений и выводит тело сообщения на экран.
Google выпустил специальную сборку Chromium — Dart VM . Использование Dartium означает, что вам не нужно компилировать код в JavaScript, пока вы не будете готовы к тестированию в других браузерах.
В следующей таблице сравниваются функции Dart и JavaScript.
Особенность | дротик | JavaScript |
---|---|---|
Система типов | Необязательный, динамический | Слабый, динамичный |
Классы | Да, одиночное наследство | прототипичный |
Интерфейсы | Да, несколько интерфейсов | нет |
совпадение | Да, с изолятами | Да, с веб-работниками HTML5 |
Это руководство дает базовое представление о языке программирования Dart.
Дартс Программирование — Окружающая среда
В этой главе обсуждается настройка среды выполнения для Dart на платформе Windows.
Выполнение скрипта онлайн с помощью DartPad
Вы можете проверить свои сценарии в Интернете с помощью онлайн-редактора по адресу https://dartpad.dartlang.org/ . Dart Editor выполняет сценарий и отображает как HTML, так и вывод консоли. Онлайн-редактор поставляется с набором предустановленных примеров кода.
Скриншот редактора Dartpad приведен ниже —
Dartpad также позволяет кодировать более ограниченным образом. Это можно сделать, установив опцию Strong mode в правом нижнем углу редактора. Сильный режим помогает с —
- Более сильная статическая и динамическая проверка
- Генерация идиоматического кода JavaScript для лучшей совместимости.
Вы можете попробовать следующий пример, используя Dartpad
void main() { print('hello world'); }
Код будет отображать следующий вывод
hello world
Настройка локальной среды
В этом разделе давайте посмотрим, как настроить локальную среду.
Использование текстового редактора
Примерами нескольких редакторов являются Windows Notepad, Notepad ++, Emacs, vim или vi и т. Д. Редакторы могут отличаться в разных операционных системах. Исходные файлы обычно называются с расширением «.dart».
Установка Dart SDK
Текущая стабильная версия Dart — 1.21.0 . DART SDK можно скачать с —
https://www.dartlang.org/install/archive
http://www.gekorm.com/dart-windows/
Скриншот установки Dart SDK приведен ниже —
По завершении установки SDK установите для переменной среды PATH значение —
<dart-sdk-path>\bin
Проверка установки
Чтобы убедиться, что Dart был успешно установлен, откройте командную строку и введите следующую команду:
Dart
Если установка прошла успешно, она покажет время выполнения дротика.
Поддержка IDE
Множество IDE поддерживают скриптинг в Dart. Примерами могут служить Eclipse, IntelliJ и WebStorm от компании Jet Brains.
Ниже приведены шаги по настройке среды Dart с использованием IDE WebStrom .
Установка WebStorm
Установочный файл для WebStorm можно загрузить по адресу https://www.jetbrains.com/webstorm/download/#section=windows-version.
Установочный файл WebStorm доступен для Mac OS, Windows и Linux.
После загрузки установочных файлов выполните следующие действия:
-
Установите Dart SDK: см. Шаги, перечисленные выше
-
Создайте новый проект Dart и настройте поддержку Dart
-
Чтобы создать новый проект Dart,
-
Нажмите Создать новый проект на экране приветствия.
-
В следующем диалоговом окне нажмите Dart
-
-
Если для пути Dart SDK не указано значение, укажите путь SDK. Например, путь SDK может быть <каталог установки dart> / dart / dartsdk .
Установите Dart SDK: см. Шаги, перечисленные выше
Создайте новый проект Dart и настройте поддержку Dart
Чтобы создать новый проект Dart,
Нажмите Создать новый проект на экране приветствия.
В следующем диалоговом окне нажмите Dart
Если для пути Dart SDK не указано значение, укажите путь SDK. Например, путь SDK может быть <каталог установки dart> / dart / dartsdk .
Добавить файл дротика в проект
Чтобы добавить файл Dart в проект —
- Щелкните правой кнопкой мыши на проекте
- New → Dart File
- Введите имя скрипта дротика
Скриншот редактора WebStorm приведен ниже —
Инструмент dart2js
Инструмент dart2js компилирует код Dart в JavaScript. Компиляция кода Dart в JS позволяет запускать сценарий Dart в браузерах, которые не поддерживают виртуальную машину Dart.
Инструмент dart2js поставляется как часть Dart SDK и находится в папке / dartsdk / bin .
Чтобы скомпилировать Dart в JavaScript, введите в терминале следующую команду
dart2js - - out = <output_file>.js <dart_script>.dart
Эта команда создает файл, который содержит JavaScript-код вашего кода Dart. Полное руководство по использованию этой утилиты можно найти на официальном сайте Dart.
Дартс программирование — синтаксис
Синтаксис определяет набор правил для написания программ. Каждая языковая спецификация определяет свой собственный синтаксис. Дарт программа состоит из —
- Переменные и операторы
- Классы
- функции
- Выражения и конструкции программирования
- Конструктивные решения и циклы
- Комментарии
- Библиотеки и пакеты
- Определения типов
- Структуры данных представлены в виде коллекций / обобщений
Ваш первый код дартс
Давайте начнем с традиционного примера «Hello World» —
main() { print("Hello World!"); }
Функция main () — это предопределенный метод в Dart. Этот метод действует как точка входа в приложение. Для выполнения сценария Dart требуется метод main () . print () — это предопределенная функция, которая печатает указанную строку или значение на стандартный вывод, т.е. на терминал.
Вывод приведенного выше кода будет —
Hello World!
Выполнить программу дартс
Вы можете выполнить программу Dart двумя способами:
- Через терминал
- С помощью IDE WebStorm
Через терминал
Чтобы выполнить программу Dart через терминал —
- Перейдите к пути текущего проекта
- Введите следующую команду в окне терминала
dart file_name.dart
С помощью IDE WebStorm
Чтобы выполнить программу Dart через IDE WebStorm —
-
Щелкните правой кнопкой мыши файл сценария Dart в среде IDE. (Файл должен содержать функцию main (), чтобы разрешить выполнение)
-
Нажмите «Выполнить <имя_файла>» . Скриншот того же приведен ниже —
Щелкните правой кнопкой мыши файл сценария Dart в среде IDE. (Файл должен содержать функцию main (), чтобы разрешить выполнение)
Нажмите «Выполнить <имя_файла>» . Скриншот того же приведен ниже —
В качестве альтернативы можно нажать или используйте сочетание клавиш Ctrl + Shift + F10, чтобы выполнить скрипт Dart.
Параметры командной строки Dart
Параметры командной строки Dart используются для изменения выполнения сценария Dart. Общие параметры командной строки для Dart включают в себя следующее —
Sr.No | Параметр командной строки и описание |
---|---|
1 | -c или —c
Включает как утверждения, так и проверки типов (проверенный режим). |
2 | —версия
Отображает информацию о версии виртуальной машины. |
3 | —packages <путь>
Указывает путь к файлу конфигурации разрешения пакета. |
4 | -p <путь>
Указывает, где найти импортированные библиотеки. Эта опция не может быть использована с —packages. |
5 | -h или —help
Отображение справки. |
Включает как утверждения, так и проверки типов (проверенный режим).
Отображает информацию о версии виртуальной машины.
Указывает путь к файлу конфигурации разрешения пакета.
Указывает, где найти импортированные библиотеки. Эта опция не может быть использована с —packages.
Отображение справки.
Включение проверенного режима
Дарт программы работают в двух режимах, а именно —
- Проверенный режим
- Режим производства (по умолчанию)
Рекомендуется запускать виртуальную машину Dart в проверенном режиме во время разработки и тестирования, поскольку она добавляет предупреждения и ошибки, помогающие процессу разработки и отладки. В проверенном режиме применяются различные проверки, такие как проверка типов и т. Д. Чтобы включить проверенный режим, добавьте параметр -c или –-checked перед именем файла сценария во время выполнения сценария.
Однако для обеспечения повышения производительности при запуске сценария рекомендуется запускать сценарий в рабочем режиме .
Рассмотрим следующий файл сценария Test.dart —
void main() { int n = "hello"; print(n); }
Запустите скрипт, введя —
dart Test.dart
Несмотря на несоответствие типов, сценарий успешно выполняется, так как проверенный режим отключен. Скрипт приведет к следующему выводу —
hello
Теперь попробуйте выполнить скрипт с опцией «- — флажок» или «-c» —
dart -c Test.dart
Или же,
dart - - checked Test.dart
Виртуальная машина Dart выдаст ошибку, сообщающую о несоответствии типов.
Unhandled exception: type 'String' is not a subtype of type 'int' of 'n' where String is from dart:core int is from dart:core #0 main (file:///C:/Users/Administrator/Desktop/test.dart:3:9) #1 _startIsolate.<anonymous closure> (dart:isolate-patch/isolate_patch.dart :261) #2 _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:148)
Идентификаторы в дротике
Идентификаторы — это имена, данные элементам в программе, таким как переменные, функции и т. Д. Правила для идентификаторов:
Идентификаторы могут включать как символы, так и цифры. Однако идентификатор не может начинаться с цифры.
-
Идентификаторы не могут включать специальные символы, кроме подчеркивания (_) или знака доллара ($).
-
Идентификаторы не могут быть ключевыми словами.
-
Они должны быть уникальными.
-
Идентификаторы чувствительны к регистру.
-
Идентификаторы не могут содержать пробелы.
Идентификаторы не могут включать специальные символы, кроме подчеркивания (_) или знака доллара ($).
Идентификаторы не могут быть ключевыми словами.
Они должны быть уникальными.
Идентификаторы чувствительны к регистру.
Идентификаторы не могут содержать пробелы.
В следующих таблицах перечислены несколько примеров допустимых и недействительных идентификаторов.
Действительные идентификаторы | Неверные идентификаторы |
---|---|
имя | Var |
имя | имя |
num1 | имя |
$ результат | 1number |
Ключевые слова в дартс
Ключевые слова имеют особое значение в контексте языка. В следующей таблице перечислены некоторые ключевые слова в Dart.
аннотация 1 | Продолжить | ложный | новый | этот |
как 1 | дефолт | окончательный | ноль | бросать |
утверждать | отсроченный 1 | в конце концов | оператор 1 | правда |
асинхронный 2 | делать | за | часть 1 | пытаться |
асинхронный * 2 | динамический 1 | получить 1 | Rethrow | typedef 1 |
жду 2 | еще | если | вернуть | вар |
перерыв | перечисление | реализует 1 | набор 1 | недействительным |
дело | экспорт 1 | импорт 1 | статический 1 | в то время как |
ловить | внешний 1 | в | супер | с |
учебный класс | продолжается | является | переключатель | доходность 2 |
Const | фабрика 1 | библиотека 1 | синхронизация * 2 | доходность * 2 |
Пробелы и разрывы строк
Дарт игнорирует пробелы, табуляции и новые строки, которые появляются в программах. Вы можете свободно использовать пробелы, табуляции и переводы строк в своей программе, и вы можете свободно форматировать и делать отступы в своих программах аккуратно и согласованно, что делает код легким для чтения и понимания.
Дарт чувствителен к регистру
Дарт чувствителен к регистру. Это означает, что Дарт различает прописные и строчные буквы.
Заявления заканчиваются точкой с запятой
Каждая строка инструкции называется заявлением. Каждый оператор dart должен заканчиваться точкой с запятой (;). Одна строка может содержать несколько операторов. Однако эти утверждения должны быть разделены точкой с запятой.
Комментарии в дартс
Комментарии — это способ улучшить читаемость программы. Комментарии могут использоваться для включения дополнительной информации о программе, такой как автор кода, подсказки о функции / конструкции и т. Д. Комментарии игнорируются компилятором.
Дарт поддерживает следующие типы комментариев —
-
Однострочные комментарии (//) — любой текст между «//» и концом строки рассматривается как комментарий
-
Многострочные комментарии (/ * * /) — эти комментарии могут занимать несколько строк.
Однострочные комментарии (//) — любой текст между «//» и концом строки рассматривается как комментарий
Многострочные комментарии (/ * * /) — эти комментарии могут занимать несколько строк.
пример
// this is single line comment /* This is a Multi-line comment */
Объектно-ориентированное программирование в дартс
Дарт это объектно-ориентированный язык. Объектная ориентация — это парадигма разработки программного обеспечения, которая следует моделированию в реальном мире. Объектная ориентация рассматривает программу как совокупность объектов, которые взаимодействуют друг с другом через механизм, называемый методами.
-
Объект — объект представляет собой представление в реальном времени любого объекта. Согласно Грэди Броу, каждый объект должен иметь три особенности —
-
Состояние — описывается атрибутами объекта.
-
Поведение — описывает, как будет действовать объект.
-
Идентичность — это уникальное значение, которое отличает объект от множества подобных подобных объектов.
-
-
Класс — класс с точки зрения ООП является планом для создания объектов. Класс инкапсулирует данные для объекта.
-
Метод — Методы облегчают общение между объектами.
Объект — объект представляет собой представление в реальном времени любого объекта. Согласно Грэди Броу, каждый объект должен иметь три особенности —
Состояние — описывается атрибутами объекта.
Поведение — описывает, как будет действовать объект.
Идентичность — это уникальное значение, которое отличает объект от множества подобных подобных объектов.
Класс — класс с точки зрения ООП является планом для создания объектов. Класс инкапсулирует данные для объекта.
Метод — Методы облегчают общение между объектами.
Пример: дартс и объектная ориентация
class TestClass { void disp() { print("Hello World"); } } void main() { TestClass c = new TestClass(); c.disp(); }
Приведенный выше пример определяет класс TestClass . У класса есть метод disp () . Метод выводит на терминал строку «Hello World». Новое ключевое слово создает объект класса. Объект вызывает метод disp () .
Код должен выдать следующий вывод:
Hello World
Программирование дротиков — Типы данных
Одной из наиболее фундаментальных характеристик языка программирования является набор типов данных, которые он поддерживает. Это тип значений, которые могут быть представлены и манипулировать на языке программирования.
Язык дартс поддерживает следующие типы:
- чисел
- Струны
- Булевы
- Списки
- Карты
чисел
Числа в Dart используются для представления числовых литералов. Number Dart выпускается в двух вариантах:
-
Integer — целочисленные значения представляют не дробные значения, то есть числовые значения без десятичной точки. Например, значение «10» является целым числом. Целочисленные литералы представлены с помощью ключевого слова int .
-
Double — Dart также поддерживает дробные числовые значения, то есть значения с десятичными точками. Тип данных Double в Dart представляет 64-разрядное число (с двойной точностью) с плавающей запятой. Например, значение «10.10». Ключевое слово double используется для представления литералов с плавающей запятой.
Integer — целочисленные значения представляют не дробные значения, то есть числовые значения без десятичной точки. Например, значение «10» является целым числом. Целочисленные литералы представлены с помощью ключевого слова int .
Double — Dart также поддерживает дробные числовые значения, то есть значения с десятичными точками. Тип данных Double в Dart представляет 64-разрядное число (с двойной точностью) с плавающей запятой. Например, значение «10.10». Ключевое слово double используется для представления литералов с плавающей запятой.
Струны
Строки представляют собой последовательность символов. Например, если вы хотите сохранить некоторые данные, такие как имя, адрес и т. Д., Следует использовать строковый тип данных. Строка Dart представляет собой последовательность кодовых единиц UTF-16. Руны используются для представления последовательности кодовых единиц UTF-32.
Ключевое слово String используется для представления строковых литералов. Строковые значения вставляются в одинарные или двойные кавычки.
логический
Тип данных Boolean представляет логические значения true и false. Дарт использует ключевое слово bool для представления логического значения.
Список и Карта
Список типов данных и карта используются для представления коллекции объектов. Список — это упорядоченная группа объектов. Тип данных List в Dart является синонимом концепции массива в других языках программирования. Тип данных Map представляет набор значений в виде пар ключ-значение. Библиотека dart: core позволяет создавать и управлять этими коллекциями через предопределенные классы List и Map соответственно.
Динамический Тип
Дарт — необязательный типизированный язык. Если тип переменной не указан явно, тип переменной является динамическим . Ключевое слово dynamic также можно явно использовать в качестве аннотации типа.
Программирование дротиков — переменные
Переменная — это «именованное пространство в памяти», в котором хранятся значения. Другими словами, он действует как контейнер для значений в программе. Имена переменных называются идентификаторами. Ниже приведены правила именования для идентификатора.
-
Идентификаторы не могут быть ключевыми словами.
-
Идентификаторы могут содержать буквы и цифры.
-
Идентификаторы не могут содержать пробелы и специальные символы, кроме знака подчеркивания (_) и знака доллара ($).
-
Имена переменных не могут начинаться с цифры.
Идентификаторы не могут быть ключевыми словами.
Идентификаторы могут содержать буквы и цифры.
Идентификаторы не могут содержать пробелы и специальные символы, кроме знака подчеркивания (_) и знака доллара ($).
Имена переменных не могут начинаться с цифры.
Введите Синтаксис
Переменная должна быть объявлена перед использованием. Дарт использует ключевое слово var для достижения того же. Синтаксис для объявления переменной приведен ниже.
var name = 'Smith';
Все переменные в dart хранят ссылку на значение, а не содержат значение. Переменная с именем name содержит ссылку на объект String со значением «Smith».
Dart поддерживает проверку типов , добавляя префикс имени переменной к типу данных. Проверка типов гарантирует, что переменная содержит только данные, относящиеся к типу данных. Синтаксис для того же приведен ниже —
String name = 'Smith'; int num = 10;
Рассмотрим следующий пример —
void main() { String name = 1; }
Приведенный выше фрагмент приведет к предупреждению, поскольку значение, присвоенное переменной, не соответствует типу данных переменной.
Выход
Warning: A value of type 'String' cannot be assigned to a variable of type 'int'
Все неинициализированные переменные имеют начальное значение null. Это потому, что Дарт рассматривает все значения как объекты. Следующий пример иллюстрирует то же самое —
void main() { int num; print(num); }
Выход
Null
Динамическое ключевое слово
Переменные, объявленные без статического типа, неявно объявляются как динамические. Переменные также могут быть объявлены с использованием ключевого слова dynamic вместо ключевого слова var.
Следующий пример иллюстрирует то же самое.
void main() { dynamic x = "tom"; print(x); }
Выход
tom
Финал и Конст
Ключевое слово final и const используются для объявления констант. Dart предотвращает изменение значений переменной, объявленной с использованием ключевого слова final или const. Эти ключевые слова могут использоваться вместе с типом данных переменной или вместо ключевого слова var .
Ключевое слово const используется для представления константы времени компиляции. Переменные, объявленные с использованием ключевого слова const , неявно являются окончательными.
Синтаксис: окончательное ключевое слово
final variable_name
ИЛИ ЖЕ
final data_type variable_name
Синтаксис: ключевое слово const
const variable_name
ИЛИ ЖЕ
const data_type variable_name
Пример — окончательное ключевое слово
void main() { final val1 = 12; print(val1); }
Выход
12
Пример — ключевое слово const
void main() { const pi = 3.14; const area = pi*12*12; print("The output is ${area}"); }
В приведенном выше примере объявляются две константы, pi и area , с использованием ключевого слова const . Значение переменной области является константой времени компиляции.
Выход
The output is 452.15999999999997
Примечание. Только константные переменные могут использоваться для вычисления постоянной времени компиляции. Константы времени компиляции — это константы, значения которых будут определены во время компиляции
пример
Дарт генерирует исключение, если делается попытка изменить переменные, объявленные с ключевым словом final или const. Пример, приведенный ниже, иллюстрирует то же самое —
void main() { final v1 = 12; const v2 = 13; v2 = 12; }
Приведенный выше код выдаст следующую ошибку в качестве вывода —
Unhandled exception: cannot assign to final variable 'v2='. NoSuchMethodError: cannot assign to final variable 'v2=' #0 NoSuchMethodError._throwNew (dart:core-patch/errors_patch.dart:178) #1 main (file: Test.dart:5:3) #2 _startIsolate.<anonymous closure> (dart:isolate-patch/isolate_patch.dart:261) #3 _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:148)
Дарт Программирование — Операторы
Выражение — это особый вид оператора, который оценивает значение. Каждое выражение состоит из —
-
Операнды — представляет данные
-
Оператор — определяет, как будут обрабатываться операнды для получения значения.
Операнды — представляет данные
Оператор — определяет, как будут обрабатываться операнды для получения значения.
Рассмотрим следующее выражение — «2 + 3». В этом выражении 2 и 3 являются операндами, а символ «+» (плюс) является оператором .
В этой главе мы обсудим операторы, доступные в Dart.
- Арифметические Операторы
- Равенство и реляционные операторы
- Тип теста Операторы
- Битовые операторы
- Операторы присваивания
- Логические Операторы
Арифметические Операторы
В следующей таблице приведены арифметические операторы, поддерживаемые Dart.
Sr.No | Операторы и смысл |
---|---|
1 | +
добавлять |
2 | —
вычитать |
3 | -expr
Унарный минус, также известный как отрицание (обратный знак выражения) |
4 | *
Умножение |
5 | /
Делить |
6 | ~ /
Разделите, возвращая целочисленный результат |
7 | %
Получить остаток от целочисленного деления (по модулю) |
8 | ++
инкремент |
9 | —
декремент |
добавлять
вычитать
Унарный минус, также известный как отрицание (обратный знак выражения)
Умножение
Делить
Разделите, возвращая целочисленный результат
Получить остаток от целочисленного деления (по модулю)
инкремент
декремент
Равенство и реляционные операторы
Реляционные операторы проверяют или определяют тип отношений между двумя объектами. Реляционные операторы возвращают логическое значение, т.е. истина / ложь.
Предположим, что значение A равно 10, а B равно 20.
оператор | Описание | пример |
---|---|---|
> | Лучше чем | (A> B) Неверно |
< | Меньше чем | (A <B) верно |
> = | Больше или равно | (A> = B) Неверно |
<= | Меньше или равно | (A <= B) верно |
== | равенство | (A == B) верно |
знак равно | Не равный | (A! = B) верно |
Тип теста Операторы
Эти операторы удобны для проверки типов во время выполнения.
оператор | Имея в виду |
---|---|
является | Истинно, если объект имеет указанный тип |
является! | False, если объект имеет указанный тип |
Битовые операторы
В следующей таблице перечислены побитовые операторы, доступные в Dart, и их роль.
оператор | Описание | пример |
---|---|---|
Побитовое И | а & б | Возвращает единицу в каждой битовой позиции, для которой соответствующие биты обоих операндов равны единице. |
Побитовое ИЛИ | а | б | Возвращает единицу в каждой битовой позиции, для которой соответствующие биты одного или обоих операндов являются единицами. |
Побитовый XOR | а ^ б | Возвращает единицу в каждой битовой позиции, для которой соответствующие биты одного, но не обоих операндов являются единицами. |
Побитовое НЕ | ~ a | Инвертирует биты своего операнда. |
Сдвиг влево | a ≪ b | Сдвиг a в двоичном представлении b (<32) битов влево, смещение нуля справа. |
Смещение вправо вправо | a ≫ b | Сдвиг a в двоичном представлении b (<32) битов вправо, отбрасывание битов смещено. |
Операторы присваивания
В следующей таблице перечислены операторы присваивания, доступные в Dart.
Sr.No | Оператор и описание |
---|---|
1 | = (Простое назначение)
Назначает значения от правого операнда к левому операнду Пример : C = A + B назначит значение A + B в C |
2 | знак равно
Назначайте значение только в том случае, если переменная равна нулю |
3 | + = (Добавить и присвоить)
Он добавляет правый операнд к левому операнду и присваивает результат левому операнду. Пример : C + = A эквивалентно C = C + A |
4 | ─ = (Вычитание и назначение)
Он вычитает правый операнд из левого операнда и присваивает результат левому операнду. Пример : C — = A эквивалентно C = C — A |
5 | * = (Умножение и назначение)
Он умножает правый операнд на левый операнд и присваивает результат левому операнду. Пример : C * = A эквивалентно C = C * A |
6 | / = (Разделить и Назначение)
Он делит левый операнд на правый операнд и присваивает результат левому операнду. |
Назначает значения от правого операнда к левому операнду
Пример : C = A + B назначит значение A + B в C
Назначайте значение только в том случае, если переменная равна нулю
Он добавляет правый операнд к левому операнду и присваивает результат левому операнду.
Пример : C + = A эквивалентно C = C + A
Он вычитает правый операнд из левого операнда и присваивает результат левому операнду.
Пример : C — = A эквивалентно C = C — A
Он умножает правый операнд на левый операнд и присваивает результат левому операнду.
Пример : C * = A эквивалентно C = C * A
Он делит левый операнд на правый операнд и присваивает результат левому операнду.
Примечание. Та же логика применима к побитовым операторам, поэтому они станут ≪ =, ≫ =, ≫ =, ≫ =, | = и ^ =.
Логические Операторы
Логические операторы используются для объединения двух или более условий. Логические операторы возвращают логическое значение. Предположим, что значение переменной A равно 10, а B равно 20.
оператор | Описание | пример |
---|---|---|
&& |
И — Оператор возвращает true, только если все указанные выражения возвращают true |
(A> 10 && B> 10) — Ложь. |
|| |
ИЛИ — оператор возвращает true, если хотя бы одно из указанных выражений возвращает true |
(A> 10 || B> 10) верно. |
! |
NOT — оператор возвращает результат, обратный выражению. Например,! (7> 5) возвращает false |
! (A> 10) верно. |
И — Оператор возвращает true, только если все указанные выражения возвращают true
ИЛИ — оператор возвращает true, если хотя бы одно из указанных выражений возвращает true
NOT — оператор возвращает результат, обратный выражению. Например,! (7> 5) возвращает false
Условные выражения
В Dart есть два оператора, которые позволяют вам вычислять выражения, которые в противном случае могли бы требовать операторов ifelse —
состояние ? expr1: expr2
Если условие истинно, выражение вычисляет expr1 (и возвращает его значение); в противном случае он вычисляет и возвращает значение expr2 .
expr1 ?? expr2
Если expr1 не равен NULL, возвращает его значение; в противном случае вычисляет и возвращает значение expr2
пример
В следующем примере показано, как вы можете использовать условное выражение в Dart —
void main() { var a = 10; var res = a > 12 ? "value greater than 10":"value lesser than or equal to 10"; print(res); }
Это даст следующий результат —
value lesser than or equal to 10
пример
Давайте возьмем другой пример —
void main() { var a = null; var b = 12; var res = a ?? b; print(res); }
Это даст следующий результат —
12
Дартс программирование — петли
Иногда определенные инструкции требуют повторного выполнения. Петли являются идеальным способом сделать то же самое. Цикл представляет собой набор инструкций, которые необходимо повторить. В контексте цикла повторение называется итерацией .
Следующий рисунок иллюстрирует классификацию петель —
Давайте начнем обсуждение с определенными циклами. Цикл, число итераций которого является определенным / фиксированным, называется определенным циклом .
Sr.No | Цикл и описание |
---|---|
1 | для цикла
Цикл for является реализацией определенного цикла. Цикл for выполняет блок кода указанное количество раз. Его можно использовать для перебора фиксированного набора значений, например массива |
2 | для … в петле
Цикл for … in используется для просмотра свойств объекта. |
Цикл for является реализацией определенного цикла. Цикл for выполняет блок кода указанное количество раз. Его можно использовать для перебора фиксированного набора значений, например массива
Цикл for … in используется для просмотра свойств объекта.
Двигаясь дальше, давайте теперь обсудим неопределенные циклы. Неопределенный цикл используется, когда число итераций в цикле не определено или неизвестно. Неопределенные циклы могут быть реализованы с помощью —
Sr.No | Цикл и описание |
---|---|
1 | пока петля
Цикл while выполняет инструкции каждый раз, когда указанное условие оценивается как true. Другими словами, цикл оценивает условие перед выполнением блока кода. |
2 | делать … пока Loop
Цикл do … while похож на цикл while, за исключением того, что цикл do … while не оценивает условие при первом выполнении цикла. |
Цикл while выполняет инструкции каждый раз, когда указанное условие оценивается как true. Другими словами, цикл оценивает условие перед выполнением блока кода.
Цикл do … while похож на цикл while, за исключением того, что цикл do … while не оценивает условие при первом выполнении цикла.
Давайте теперь перейдем к обсуждению Lart Control Statements of Dart.
Sr.No | Контрольное заявление и описание |
---|---|
1 | заявление о нарушении
Оператор break используется для извлечения элемента управления из конструкции. Использование прерывания в цикле приводит к тому, что программа выходит из цикла. Ниже приведен пример оператора break . |
2 | продолжить заявление
Оператор continue пропускает последующие операторы в текущей итерации и возвращает элемент управления в начало цикла. |
Оператор break используется для извлечения элемента управления из конструкции. Использование прерывания в цикле приводит к тому, что программа выходит из цикла. Ниже приведен пример оператора break .
Оператор continue пропускает последующие операторы в текущей итерации и возвращает элемент управления в начало цикла.
Использование меток для управления потоком
Метка — это просто идентификатор, за которым следует двоеточие (:), которое применяется к выражению или блоку кода. Метка может использоваться с разрывом и продолжать более точно контролировать поток.
Разрывы строк не допускаются между оператором continue или break и его именем метки. Кроме того, не должно быть каких-либо других операторов между именем метки и связанным циклом.
Пример: метка с перерывом
void main() { outerloop: // This is the label name for (var i = 0; i < 5; i++) { print("Innerloop: ${i}"); innerloop: for (var j = 0; j < 5; j++) { if (j > 3 ) break ; // Quit the innermost loop if (i == 2) break innerloop; // Do the same thing if (i == 4) break outerloop; // Quit the outer loop print("Innerloop: ${j}"); } } }
Следующий вывод отображается при успешном выполнении вышеуказанного кода.
Innerloop: 0 Innerloop: 0 Innerloop: 1 Innerloop: 2 Innerloop: 3 Innerloop: 1 Innerloop: 0 Innerloop: 1 Innerloop: 2 Innerloop: 3 Innerloop: 2 Innerloop: 3 Innerloop: 0 Innerloop: 1 Innerloop: 2 Innerloop: 3 Innerloop: 4
Пример: метка с продолжением
void main() { outerloop: // This is the label name for (var i = 0; i < 3; i++) { print("Outerloop:${i}"); for (var j = 0; j < 5; j++) { if (j == 3){ continue outerloop; } print("Innerloop:${j}"); } } }
Следующий вывод отображается при успешном выполнении вышеуказанного кода.
Outerloop: 0 Innerloop: 0 Innerloop: 1 Innerloop: 2 Outerloop: 1 Innerloop: 0 Innerloop: 1 Innerloop: 2 Outerloop: 2 Innerloop: 0 Innerloop: 1 Innerloop: 2
Дартс Программирование — Принятие решений
Условная конструкция / конструкция принятия решения оценивает условие перед выполнением инструкций.
Условные конструкции в Dart классифицируются в следующей таблице.
Sr.No | Заявление и описание |
---|---|
1 | если заявление
Оператор if состоит из логического выражения, за которым следует один или несколько операторов. |
2 | Если … остальное заявление
За if может следовать необязательный блок else . Блок else будет выполнен, если логическое выражение, проверенное блоком if, оценивается как false. |
3 | еще … если Лестница
Еще … если лестница полезна для тестирования нескольких условий. Ниже приводится синтаксис того же. |
4 | переключить… заявление случая
Оператор switch оценивает выражение, сопоставляет значение выражения с предложением case и выполняет операторы, связанные с этим случаем. |
Оператор if состоит из логического выражения, за которым следует один или несколько операторов.
За if может следовать необязательный блок else . Блок else будет выполнен, если логическое выражение, проверенное блоком if, оценивается как false.
Еще … если лестница полезна для тестирования нескольких условий. Ниже приводится синтаксис того же.
Оператор switch оценивает выражение, сопоставляет значение выражения с предложением case и выполняет операторы, связанные с этим случаем.
Дартс Программирование — Числа
Номера дротиков можно классифицировать как —
-
int — Целое число произвольного размера. Тип данных int используется для представления целых чисел.
-
double — 64-битные (с двойной точностью) числа с плавающей точкой, как указано в стандарте IEEE 754. Двойной тип данных используется для представления дробных чисел
int — Целое число произвольного размера. Тип данных int используется для представления целых чисел.
double — 64-битные (с двойной точностью) числа с плавающей точкой, как указано в стандарте IEEE 754. Двойной тип данных используется для представления дробных чисел
Тип num наследуется типами int и double . Базовая библиотека dart позволяет выполнять множество операций с числовыми значениями.
Синтаксис для объявления числа как указано ниже —
int var_name; // declares an integer variable double var_name; // declares a double variable
пример
void main() { int num1 = 10; // declare an integer double num2 = 10.50; // declare a double value print(num1); print(num2); }
Это даст следующий результат —
10 10.5
Примечание . Виртуальная машина Dart выдает исключение, если дробные значения назначены целочисленным переменным.
анализ
Статическая функция parse () позволяет анализировать строку, содержащую числовой литерал, в число. Следующая иллюстрация демонстрирует то же самое —
void main() { print(num.parse('12')); print(num.parse('10.91')); }
Приведенный выше код приведет к следующему выводу:
12 10.91
Функция синтаксического анализа выдает исключение FormatException, если ей передается любое значение, кроме цифр. В следующем коде показано, как передать буквенно-цифровое значение в функцию parse () .
пример
void main() { print(num.parse('12A')); print(num.parse('AAAA')); }
Приведенный выше код приведет к следующему выводу:
Unhandled exception: FormatException: 12A #0 num.parse (dart:core/num.dart:446) #1 main (file:///D:/Demos/numbers.dart:4:13) #2 _startIsolate.<anonymous closure> (dart:isolatepatch/isolate_patch.dart:261) #3 _RawReceivePortImpl._handleMessage (dart:isolatepatch/isolate_patch.dart:148)
Числовые свойства
В следующей таблице перечислены свойства, поддерживаемые номерами Dart.
Sr.No | Описание недвижимости |
---|---|
1 | хэш-код
Возвращает хеш-код для числового значения. |
2 | isFinite
Истинно, если число конечно; иначе ложно. |
3 | isInfinite
Истинно, если число положительная бесконечность или отрицательная бесконечность; иначе ложно. |
4 | IsNaN
True, если число является двойным значением Not-a-Number; иначе ложно. |
5 | isNegative
True, если число отрицательное; иначе ложно. |
6 | знак
Возвращает минус один, ноль или плюс один в зависимости от знака и числового значения числа. |
7 | даже
Возвращает true, если число является четным числом. |
8 | ISODD
Возвращает true, если число является нечетным числом. |
Возвращает хеш-код для числового значения.
Истинно, если число конечно; иначе ложно.
Истинно, если число положительная бесконечность или отрицательная бесконечность; иначе ложно.
True, если число является двойным значением Not-a-Number; иначе ложно.
True, если число отрицательное; иначе ложно.
Возвращает минус один, ноль или плюс один в зависимости от знака и числового значения числа.
Возвращает true, если число является четным числом.
Возвращает true, если число является нечетным числом.
Численные методы
Ниже приведен список часто используемых методов, поддерживаемых числами —
Sr.No | Метод и описание |
---|---|
1 | абс
Возвращает абсолютное значение числа. |
2 | перекрывать
Возвращает наименьшее целое число, не меньшее, чем число. |
3 | сравнить с
Сравнивает это с другим номером. |
4 | Этаж
Возвращает наибольшее целое число, не превышающее текущее число. |
5 | остаток
Возвращает усеченный остаток после деления двух чисел. |
6 | Круглый
Возвращает целое число, ближайшее к текущим числам. |
7 | удвоить
Возвращает двойной эквивалент числа. |
8 | toInt
Возвращает целочисленный эквивалент числа. |
9 | нанизывать
Возвращает строковое эквивалентное представление числа. |
10 | усекать
Возвращает целое число после сброса любых дробных цифр. |
Возвращает абсолютное значение числа.
Возвращает наименьшее целое число, не меньшее, чем число.
Сравнивает это с другим номером.
Возвращает наибольшее целое число, не превышающее текущее число.
Возвращает усеченный остаток после деления двух чисел.
Возвращает целое число, ближайшее к текущим числам.
Возвращает двойной эквивалент числа.
Возвращает целочисленный эквивалент числа.
Возвращает строковое эквивалентное представление числа.
Возвращает целое число после сброса любых дробных цифр.
Дартс программирование — строка
Тип данных String представляет собой последовательность символов. Строка Dart представляет собой последовательность из 16 кодовых единиц UTF.
Строковые значения в Dart могут быть представлены с использованием одинарных или двойных или тройных кавычек. Однострочные строки представлены в одинарных или двойных кавычках. Тройные кавычки используются для представления многострочных строк.
Синтаксис представления строковых значений в Dart приведен ниже.
Синтаксис
String variable_name = 'value' OR String variable_name = ''value'' OR String variable_name = '''line1 line2''' OR String variable_name= ''''''line1 line2''''''
Следующий пример иллюстрирует использование типа данных String в Dart.
void main() { String str1 = 'this is a single line string'; String str2 = "this is a single line string"; String str3 = '''this is a multiline line string'''; String str4 = """this is a multiline line string"""; print(str1); print(str2); print(str3); print(str4); }
Это даст следующий результат —
this is a single line string this is a single line string this is a multiline line string this is a multiline line string
Строки неизменны. Однако строки могут подвергаться различным операциям, и результирующая строка может быть сохранена как новое значение.
Строковая интерполяция
Процесс создания новой строки путем добавления значения в статическую строку называется конкатенацией или интерполяцией . Другими словами, это процесс добавления строки в другую строку.
Оператор плюс (+) — это широко используемый механизм объединения / интерполяции строк.
Пример 1
void main() { String str1 = "hello"; String str2 = "world"; String res = str1+str2; print("The concatenated string : ${res}"); }
Это даст следующий результат —
The concatenated string : Helloworld
Пример 2
Вы можете использовать «$ {}», можно использовать для интерполяции значения выражения Dart в строках. Следующий пример иллюстрирует то же самое.
void main() { int n=1+1; String str1 = "The sum of 1 and 1 is ${n}"; print(str1); String str2 = "The sum of 2 and 2 is ${2+2}"; print(str2); }
Это даст следующий результат —
The sum of 1 and 1 is 2 The sum of 2 and 2 is 4
Свойства строки
Свойства, перечисленные в следующей таблице, доступны только для чтения.
Sr.No | Описание недвижимости |
---|---|
1 | Codeunits
Возвращает неизменяемый список кодовых единиц UTF-16 этой строки. |
2 | пустой
Возвращает true, если эта строка пуста. |
3 | длина
Возвращает длину строки, включая символы пробела, табуляции и новой строки. |
Возвращает неизменяемый список кодовых единиц UTF-16 этой строки.
Возвращает true, если эта строка пуста.
Возвращает длину строки, включая символы пробела, табуляции и новой строки.
Методы манипулирования строками
Класс String в библиотеке dart: core также предоставляет методы для работы со строками. Некоторые из этих методов приведены ниже —
Sr.No | Методы и описание |
---|---|
1 | toLowerCase ()
Преобразует все символы в этой строке в нижний регистр. |
2 | toUpperCase ()
Преобразует все символы в этой строке в верхний регистр. |
3 | отделка()
Возвращает строку без начальных и конечных пробелов. |
4 | сравнить с()
Сравнивает этот объект с другим. |
5 | заменить все()
Заменяет все подстроки, которые соответствуют указанному шаблону с данным значением. |
6 | Трещина()
Разбивает строку в совпадениях указанного разделителя и возвращает список подстрок. |
7 | подстрока ()
Возвращает подстроку этой строки, которая простирается от startIndex, включительно, до endIndex, эксклюзив. |
8 | нанизывать()
Возвращает строковое представление этого объекта. |
9 | codeUnitAt ()
Возвращает 16-битную кодовую единицу UTF-16 по заданному индексу. |
Преобразует все символы в этой строке в нижний регистр.
Преобразует все символы в этой строке в верхний регистр.
Возвращает строку без начальных и конечных пробелов.
Сравнивает этот объект с другим.
Заменяет все подстроки, которые соответствуют указанному шаблону с данным значением.
Разбивает строку в совпадениях указанного разделителя и возвращает список подстрок.
Возвращает подстроку этой строки, которая простирается от startIndex, включительно, до endIndex, эксклюзив.
Возвращает строковое представление этого объекта.
Возвращает 16-битную кодовую единицу UTF-16 по заданному индексу.
Программирование дротиков — логическое
Dart предоставляет встроенную поддержку для логического типа данных. Логический тип данных в DART поддерживает только два значения — true и false. Ключевое слово bool используется для представления логического литерала в DART.
Синтаксис объявления логической переменной в DART такой, как приведенный ниже —
bool var_name = true; OR bool var_name = false
пример
void main() { bool test; test = 12 > 5; print(test); }
Это даст следующий результат —
true
пример
В отличие от JavaScript, логический тип данных распознает только литерал true как true. Любое другое значение считается ложным. Рассмотрим следующий пример —
var str = 'abc'; if(str) { print('String is not empty'); } else { print('Empty String'); }
Приведенный выше фрагмент, если он выполняется в JavaScript, выведет сообщение «String is not empty», поскольку конструкция if вернет true, если строка не пуста.
Однако в Dart str преобразуется в false как str! = True . Следовательно, фрагмент будет печатать сообщение «Пустая строка» (при запуске в режиме без проверки).
пример
Приведенный выше фрагмент при запуске в проверенном режиме вызовет исключение. То же самое показано ниже —
void main() { var str = 'abc'; if(str) { print('String is not empty'); } else { print('Empty String'); } }
В режиме проверки он выдаст следующий вывод:
Unhandled exception: type 'String' is not a subtype of type 'bool' of 'boolean expression' where String is from dart:core bool is from dart:core #0 main (file:///D:/Demos/Boolean.dart:5:6) #1 _startIsolate.<anonymous closure> (dart:isolate-patch/isolate_patch.dart:261) #2 _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:148)
В режиме Unchecked будет получен следующий вывод:
Empty String
Примечание. По умолчанию среда IDE WebStorm работает в проверенном режиме.
Программирование Дартс — Списки
Очень часто используемая коллекция в программировании — это массив . Dart представляет массивы в виде объектов List . Список — это просто упорядоченная группа объектов. Библиотека dart: core предоставляет класс List, который позволяет создавать списки и управлять ими.
Логическое представление списка в Dart приведено ниже —
-
test_list — это идентификатор, который ссылается на коллекцию.
-
Список содержит в себе значения 12, 13 и 14. Блоки памяти, содержащие эти значения, называются элементами .
-
Каждый элемент в Списке идентифицируется уникальным номером, называемым индексом . Индекс начинается с нуля и продолжается до n-1, где n — общее количество элементов в списке. Индекс также упоминается как индекс .
test_list — это идентификатор, который ссылается на коллекцию.
Список содержит в себе значения 12, 13 и 14. Блоки памяти, содержащие эти значения, называются элементами .
Каждый элемент в Списке идентифицируется уникальным номером, называемым индексом . Индекс начинается с нуля и продолжается до n-1, где n — общее количество элементов в списке. Индекс также упоминается как индекс .
Списки могут быть классифицированы как —
- Список фиксированной длины
- Растущий список
Давайте теперь обсудим эти два типа списков в деталях.
Список фиксированной длины
Длина списка фиксированной длины не может изменяться во время выполнения. Синтаксис для создания списка с фиксированной длиной приведен ниже.
Шаг 1 — Объявление списка
Синтаксис объявления списка фиксированной длины приведен ниже —
var list_name = new List(initial_size)
Приведенный выше синтаксис создает список указанного размера. Список не может увеличиваться или уменьшаться во время выполнения. Любая попытка изменить размер списка приведет к исключению.
Шаг 2 — Инициализация списка
Синтаксис для инициализации списка приведен ниже.
lst_name[index] = value;
пример
void main() { var lst = new List(3); lst[0] = 12; lst[1] = 13; lst[2] = 11; print(lst); }
Это даст следующий результат —
[12, 13, 11]
Растущий список
Длина расширяемого списка может изменяться во время выполнения. Синтаксис объявления и инициализации расширяемого списка приведен ниже.
Шаг 1 — Объявление списка
var list_name = [val1,val2,val3] --- creates a list containing the specified values OR var list_name = new List() --- creates a list of size zero
Шаг 2 — Инициализация списка
Индекс / индекс используется для ссылки на элемент, который должен быть заполнен значением. Синтаксис для инициализации списка приведен ниже.
list_name[index] = value;
пример
В следующем примере показано, как создать список из 3 элементов.
void main() { var num_list = [1,2,3]; print(num_list); }
Это даст следующий результат —
[1, 2, 3]
пример
В следующем примере создается список нулевой длины с использованием пустого конструктора List () . Функция add () в классе List используется для динамического добавления элементов в список.
void main() { var lst = new List(); lst.add(12); lst.add(13); print(lst); }
Это даст следующий результат —
[12, 13]
Список свойств
В следующей таблице перечислены некоторые часто используемые свойства класса List в библиотеке dart: core .
Sr.No | Методы и описание |
---|---|
1 | первый
Возвращает первый элемент case. |
2 | пустой
Возвращает true, если в коллекции нет элементов. |
3 | isNotEmpty
Возвращает true, если в коллекции есть хотя бы один элемент. |
4 | длина
Возвращает размер списка. |
5 | прошлой
Возвращает последний элемент в списке. |
6 | обратная
Возвращает повторяемый объект, содержащий значения списков в обратном порядке. |
7 | не замужем
Проверяет, содержит ли список только один элемент, и возвращает его. |
Возвращает первый элемент case.
Возвращает true, если в коллекции нет элементов.
Возвращает true, если в коллекции есть хотя бы один элемент.
Возвращает размер списка.
Возвращает последний элемент в списке.
Возвращает повторяемый объект, содержащий значения списков в обратном порядке.
Проверяет, содержит ли список только один элемент, и возвращает его.
Программирование дротиков — списки (основные операции)
В этой главе мы обсудим, как выполнять некоторые основные операции со списками, такие как —
Sr.No | Основные операции и описание |
---|---|
1 | Вставка элементов в список
Изменяемые списки могут динамически расти во время выполнения. Функция List.add () добавляет указанное значение в конец списка и возвращает измененный объект списка. |
2 | Обновление списка
Списки в Dart могут быть обновлены с помощью — |
3 | Удаление элементов списка
Следующие функции, поддерживаемые классом List в библиотеке dart: core, можно использовать для удаления элементов в списке. |
Изменяемые списки могут динамически расти во время выполнения. Функция List.add () добавляет указанное значение в конец списка и возвращает измененный объект списка.
Списки в Dart могут быть обновлены с помощью —
Следующие функции, поддерживаемые классом List в библиотеке dart: core, можно использовать для удаления элементов в списке.
Дарт Программирование — Карта
Объект Map представляет собой простую пару ключ / значение. Ключи и значения на карте могут быть любого типа. Карта — это динамическая коллекция. Другими словами, Карты могут расти и уменьшаться во время выполнения.
Карты могут быть объявлены двумя способами —
- Использование литералов карты
- Использование конструктора карты
Объявление карты с использованием литералов карты
Чтобы объявить карту с использованием литералов карты, вам необходимо заключить пары ключ-значение в пару фигурных скобок «{}» .
Вот его синтаксис —
var identifier = { key1:value1, key2:value2 [,…..,key_n:value_n] }
Объявление карты с помощью конструктора карт
Чтобы объявить Map с помощью конструктора Map, у нас есть два шага. Сначала объявите карту, а затем инициализируйте карту.
Синтаксис для объявления карты следующий:
var identifier = new Map()
Теперь используйте следующий синтаксис для инициализации карты —
map_name[key] = value
Пример: Map Literal
void main() { var details = {'Usrname':'tom','Password':'pass@123'}; print(details); }
Это даст следующий результат —
{Usrname: tom, Password: pass@123}
Пример: добавление значений к литералам карты во время выполнения
void main() { var details = {'Usrname':'tom','Password':'pass@123'}; details['Uid'] = 'U1oo1'; print(details); }
Это даст следующий результат —
{Usrname: tom, Password: pass@123, Uid: U1oo1}
Пример: конструктор карты
void main() { var details = new Map(); details['Usrname'] = 'admin'; details['Password'] = 'admin@123'; print(details); }
Это даст следующий результат —
{Usrname: admin, Password: admin@123}
Примечание. Значением карты может быть любой объект, включая NULL.
Карта — Недвижимость
Класс Map в пакете dart: core определяет следующие свойства:
Sr.No | Описание недвижимости |
---|---|
1 | Ключи
Возвращает итеративный объект, представляющий ключи |
2 | Ценности
Возвращает итеративный объект, представляющий значения |
3 | длина
Возвращает размер карты |
4 | пустой
Возвращает true, если карта является пустой картой |
5 | isNotEmpty
Возвращает true, если карта является пустой картой |
Возвращает итеративный объект, представляющий ключи
Возвращает итеративный объект, представляющий значения
Возвращает размер карты
Возвращает true, если карта является пустой картой
Возвращает true, если карта является пустой картой
Карта — Функции
Ниже приведены наиболее часто используемые функции для работы с картами в Dart.
Sr.No | Название и описание функции |
---|---|
1 | добавить все()
Добавляет все пары ключ-значение другого на эту карту. |
2 | Чисто()
Удаляет все пары с карты. |
3 | Удалить()
Удаляет ключ и связанное с ним значение, если оно есть, с карты. |
4 | для каждого()
Применяет f к каждой паре ключ-значение на карте. |
Добавляет все пары ключ-значение другого на эту карту.
Удаляет все пары с карты.
Удаляет ключ и связанное с ним значение, если оно есть, с карты.
Применяет f к каждой паре ключ-значение на карте.
Дартс программирование — символ
Символы в Dart — это непрозрачное динамическое имя строки, используемое для отражения метаданных из библиотеки. Проще говоря, символы — это способ хранения отношений между читаемой человеком строкой и строкой, оптимизированной для использования компьютерами.
Reflection — это механизм для получения метаданных типа во время выполнения, таких как количество методов в классе, количество конструкторов или количество параметров в функции. Вы даже можете вызвать метод типа, который загружается во время выполнения.
В Dart Reflection определенные классы доступны в пакете dart: mirrors . Эта библиотека работает как в веб-приложениях, так и в приложениях командной строки.
Синтаксис
Symbol obj = new Symbol('name'); // expects a name of class or function or library to reflect
Имя должно быть действительным общедоступным именем члена Dart, общедоступным именем конструктора или библиотекым именем.
пример
Рассмотрим следующий пример. Код объявляет класс Foo в библиотеке foo_lib . Класс определяет методы m1, m2 и m3 .
Foo.dart
library foo_lib; // libarary name can be a symbol class Foo { // class name can be a symbol m1() { // method name can be a symbol print("Inside m1"); } m2() { print("Inside m2"); } m3() { print("Inside m3"); } }
Следующий код загружает библиотеку Foo.dart и ищет класс Foo с помощью типа Symbol. Поскольку мы отражаем метаданные из вышеуказанной библиотеки, код импортирует библиотеку dart: mirrors .
FooSymbol.dart
import 'dart:core'; import 'dart:mirrors'; import 'Foo.dart'; main() { Symbol lib = new Symbol("foo_lib"); //library name stored as Symbol Symbol clsToSearch = new Symbol("Foo"); // class name stored as Symbol if(checkIf_classAvailableInlibrary(lib, clsToSearch)) // searches Foo class in foo_lib library print("class found.."); } bool checkIf_classAvailableInlibrary(Symbol libraryName, Symbol className) { MirrorSystem mirrorSystem = currentMirrorSystem(); LibraryMirror libMirror = mirrorSystem.findLibrary(libraryName); if (libMirror != null) { print("Found Library"); print("checkng...class details.."); print("No of classes found is : ${libMirror.declarations.length}"); libMirror.declarations.forEach((s, d) => print(s)); if (libMirror.declarations.containsKey(className)) return true; return false; } }
Обратите внимание, что строка libMirror.declarations.forEach ((s, d) => print (s)); будет выполнять итерацию по всем объявлениям в библиотеке во время выполнения и печатать объявления как тип Symbol .
Этот код должен произвести следующий вывод —
Found Library checkng...class details.. No of classes found is : 1 Symbol("Foo") // class name displayed as symbol class found.
Пример: отображение количества методов экземпляра класса
Давайте теперь рассмотрим отображение количества методов экземпляра в классе. Предопределенный класс ClassMirror помогает нам достичь того же.
import 'dart:core'; import 'dart:mirrors'; import 'Foo.dart'; main() { Symbol lib = new Symbol("foo_lib"); Symbol clsToSearch = new Symbol("Foo"); reflect_InstanceMethods(lib, clsToSearch); } void reflect_InstanceMethods(Symbol libraryName, Symbol className) { MirrorSystem mirrorSystem = currentMirrorSystem(); LibraryMirror libMirror = mirrorSystem.findLibrary(libraryName); if (libMirror != null) { print("Found Library"); print("checkng...class details.."); print("No of classes found is : ${libMirror.declarations.length}"); libMirror.declarations.forEach((s, d) => print(s)); if (libMirror.declarations.containsKey(className)) print("found class"); ClassMirror classMirror = libMirror.declarations[className]; print("No of instance methods found is ${classMirror.instanceMembers.length}"); classMirror.instanceMembers.forEach((s, v) => print(s)); } }
Этот код должен произвести следующий вывод —
Found Library checkng...class details.. No of classes found is : 1 Symbol("Foo") found class No of instance methods found is 8 Symbol("==") Symbol("hashCode") Symbol("toString") Symbol("noSuchMethod") Symbol("runtimeType") Symbol("m1") Symbol("m2") Symbol("m3")
Преобразовать символ в строку
Вы можете преобразовать имя типа, такого как класс или библиотека, хранящуюся в символе, обратно в строку, используя класс MirrorSystem . Следующий код показывает, как вы можете преобразовать символ в строку.
import 'dart:mirrors'; void main(){ Symbol lib = new Symbol("foo_lib"); String name_of_lib = MirrorSystem.getName(lib); print(lib); print(name_of_lib); }
Он должен произвести следующий вывод —
Symbol("foo_lib") foo_lib
Дартс программирование — руны
Строки — это последовательность символов. Dart представляет строки в виде последовательности кодовых единиц Unicode UTF-16. Юникод — это формат, который определяет уникальное числовое значение для каждой буквы, цифры и символа.
Поскольку строка Dart представляет собой последовательность единиц кода UTF-16, 32-битные значения Unicode в строке представляются с использованием специального синтаксиса. Руна — это целое число, представляющее кодовую точку Unicode.
Класс String в библиотеке dart: core предоставляет механизмы для доступа к рунам . К единицам / рунам строкового кода можно получить доступ тремя способами:
- Использование функции String.codeUnitAt ()
- Использование свойства String.codeUnits
- Использование свойства String.runes
Функция String.codeUnitAt ()
К единицам кода в строке можно получить доступ через их индексы. Возвращает 16-битную кодовую единицу UTF-16 по заданному индексу.
Синтаксис
String.codeUnitAt(int index);
пример
import 'dart:core'; void main(){ f1(); } f1() { String x = 'Runes'; print(x.codeUnitAt(0)); }
Это даст следующий результат —
82
Свойство String.codeUnits
Это свойство возвращает неизменяемый список кодовых единиц UTF-16 указанной строки.
Синтаксис
String. codeUnits;
пример
import 'dart:core'; void main(){ f1(); } f1() { String x = 'Runes'; print(x.codeUnits); }
Это даст следующий результат —
[82, 117, 110, 101, 115]
String.runes Имущество
Это свойство возвращает повторяемость кодовых точек Unicode этой строки. Runes расширяет повторяемость.
Синтаксис
String.runes
пример
void main(){ "A string".runes.forEach((int rune) { var character=new String.fromCharCode(rune); print(character); }); }
Это даст следующий результат —
A s t r i n g
Кодовые точки Unicode обычно выражаются как \ uXXXX , где XXXX — это шестнадцатеричное 4-значное значение. Чтобы указать более или менее 4 шестнадцатеричных цифр, поместите значение в фигурные скобки. Для этого можно использовать конструктор класса Runes в библиотеке dart: core.
пример
main() { Runes input = new Runes(' \u{1f605} '); print(new String.fromCharCodes(input)); }
Это даст следующий результат —
Дартс Программирование — Перечисление
Перечисление используется для определения именованных значений констант. Перечислимый тип объявляется с использованием ключевого слова enum .
Синтаксис
enum enum_name { enumeration list }
Куда,
- Enum_name указывает имя типа перечисления
- Список перечисления представляет собой список идентификаторов через запятую
Каждый из символов в списке перечисления обозначает целочисленное значение, на один больше, чем символ, который предшествует ему. По умолчанию значение первого символа перечисления равно 0.
Например
enum Status { none, running, stopped, paused }
пример
enum Status { none, running, stopped, paused } void main() { print(Status.values); Status.values.forEach((v) => print('value: $v, index: ${v.index}')); print('running: ${Status.running}, ${Status.running.index}'); print('running index: ${Status.values[1]}'); }
Это даст следующий результат —
[Status.none, Status.running, Status.stopped, Status.paused] value: Status.none, index: 0 value: Status.running, index: 1 value: Status.stopped, index: 2 value: Status.paused, index: 3 running: Status.running, 1 running index: Status.running
Дартс Программирование — Функции
Функции являются строительными блоками читаемого, обслуживаемого и многократно используемого кода. Функция — это набор операторов для выполнения конкретной задачи. Функции организуют программу в логические блоки кода. После определения функции могут вызываться для доступа к коду. Это делает код многоразовым. Кроме того, функции позволяют легко читать и поддерживать код программы.
Объявление функции сообщает компилятору об имени функции, типе возврата и параметрах. Определение функции обеспечивает фактическое тело функции.
Sr.No | Функции и описание |
---|---|
1 | Определение функции
Определение функции определяет, что и как будет выполнена конкретная задача. |
2 | Вызов функции
Функция должна быть вызвана для ее выполнения. |
3 | Возврат Функции
Функции могут также возвращать значение вместе с контролем обратно к вызывающей стороне. |
4 | Параметризованная функция
Параметры — это механизм для передачи значений в функции. |
Определение функции определяет, что и как будет выполнена конкретная задача.
Функция должна быть вызвана для ее выполнения.
Функции могут также возвращать значение вместе с контролем обратно к вызывающей стороне.
Параметры — это механизм для передачи значений в функции.
Необязательные параметры
Необязательные параметры могут использоваться, когда аргументы не нужно принудительно передавать для выполнения функции. Параметр можно пометить как необязательный, добавив к его имени вопросительный знак. Необязательный параметр должен быть установлен как последний аргумент в функции.
У нас есть три типа необязательных параметров в Dart —
Sr.No | Параметр и описание |
---|---|
1 | Необязательный позиционный параметр
Чтобы указать необязательные позиционные параметры, используйте квадратные скобки []. |
2 | Необязательный именованный параметр
В отличие от позиционных параметров, имя параметра должно быть указано во время передачи значения. С помощью фигурной скобки {} можно указать необязательные именованные параметры. |
3 | Необязательные параметры со значениями по умолчанию
Параметры функции также могут быть назначены значения по умолчанию. Однако таким параметрам также могут быть явно переданы значения. |
Чтобы указать необязательные позиционные параметры, используйте квадратные скобки [].
В отличие от позиционных параметров, имя параметра должно быть указано во время передачи значения. С помощью фигурной скобки {} можно указать необязательные именованные параметры.
Параметры функции также могут быть назначены значения по умолчанию. Однако таким параметрам также могут быть явно переданы значения.
Рекурсивные функции дротиков
Рекурсия — это техника для перебора операции путем многократного вызова самой функции, пока она не достигнет результата. Рекурсия лучше всего применяется, когда вам нужно повторно вызывать одну и ту же функцию с разными параметрами внутри цикла.
пример
void main() { print(factorial(6)); } factorial(number) { if (number <= 0) { // termination case return 1; } else { return (number * factorial(number - 1)); // function invokes itself } }
Он должен произвести следующий вывод —
720
Лямбда-функции
Лямбда-функции являются кратким механизмом представления функций. Эти функции также называются функциями Arrow.
Синтаксис
[return_type]function_name(parameters)=>expression;
пример
void main() { printMsg(); print(test()); } printMsg()=> print("hello"); int test()=>123; // returning function
Он должен произвести следующий вывод —
hello 123
Программирование Дартс — Интерфейсы
Интерфейс определяет синтаксис, которого должен придерживаться любой объект. Интерфейсы определяют набор методов, доступных для объекта. У Dart нет синтаксиса для объявления интерфейсов. Объявления классов сами по себе являются интерфейсами в Dart.
Классы должны использовать ключевое слово Implements, чтобы иметь возможность использовать интерфейс. Для реализующего класса обязательно предоставить конкретную реализацию всех функций реализованного интерфейса. Другими словами, класс должен переопределить каждую функцию в интерфейсе, который он хочет реализовать.
Синтаксис: реализация интерфейса
class identifier implements interface_name
пример
В следующей программе мы объявляем класс Printer . Класс ConsolePrinter реализует неявное объявление интерфейса для класса Printer . Функция main создает объект класса ConsolePrinter с помощью ключевого слова new . Этот объект используется для вызова функции print_data, определенной в классе ConsolePrinter .
void main() { ConsolePrinter cp= new ConsolePrinter(); cp.print_data(); } class Printer { void print_data() { print("__________Printing Data__________"); } } class ConsolePrinter implements Printer { void print_data() { print("__________Printing to Console__________"); } }
Он должен произвести следующий вывод —
__________Printing to Console__________
Реализация нескольких интерфейсов
Класс может реализовывать несколько интерфейсов. Интерфейсы разделены запятой. Синтаксис для того же приведен ниже —
class identifier implements interface-1,interface_2,interface_4…….
В следующем примере показано, как вы можете реализовать несколько интерфейсов в Dart —
void main() { Calculator c = new Calculator(); print("The gross total : ${c.ret_tot()}"); print("Discount :${c.ret_dis()}"); } class Calculate_Total { int ret_tot() {} } class Calculate_Discount { int ret_dis() {} } class Calculator implements Calculate_Total,Calculate_Discount { int ret_tot() { return 1000; } int ret_dis() { return 50; } }
Он должен произвести следующий вывод —
The gross total: 1000 Discount:50
Дартс Программирование — Занятия
Дарт это объектно-ориентированный язык. Он поддерживает функции объектно-ориентированного программирования, такие как классы, интерфейсы и т. Д. Класс с точки зрения ООП — это план создания объектов. Класс инкапсулирует данные для объекта. Дарт предоставляет встроенную поддержку этой концепции, называемой классом .
Объявление класса
Используйте ключевое слово class, чтобы объявить класс в Dart. Определение класса начинается с ключевого слова class, за которым следует имя класса ; и тело класса, заключенное в пару фигурных скобок. Синтаксис для того же приведен ниже —
Синтаксис
class class_name { <fields> <getters/setters> <constructors> <functions> }
Ключевое слово class сопровождается именем класса. Правила для идентификаторов должны учитываться при именовании класса.
Определение класса может включать следующее:
-
Поля . Поле — это любая переменная, объявленная в классе. Поля представляют данные, относящиеся к объектам.
-
Сеттеры и геттеры — позволяет программе инициализировать и извлекать значения полей класса. Получатель / установщик по умолчанию связан с каждым классом. Однако значения по умолчанию могут быть переопределены путем явного определения метода установки / получения.
-
Конструкторы — отвечают за выделение памяти для объектов класса.
-
Функции — функции представляют собой действия, которые может выполнять объект. Они также иногда упоминаются как методы.
Поля . Поле — это любая переменная, объявленная в классе. Поля представляют данные, относящиеся к объектам.
Сеттеры и геттеры — позволяет программе инициализировать и извлекать значения полей класса. Получатель / установщик по умолчанию связан с каждым классом. Однако значения по умолчанию могут быть переопределены путем явного определения метода установки / получения.
Конструкторы — отвечают за выделение памяти для объектов класса.
Функции — функции представляют собой действия, которые может выполнять объект. Они также иногда упоминаются как методы.
Эти компоненты, собранные вместе, называются членами данных класса.
Пример: объявление класса
class Car { // field String engine = "E1001"; // function void disp() { print(engine); } }
В примере объявляется класс Car . У класса есть поле с именем engine . Disp () — это простая функция, которая печатает значение полевого механизма .
Создание экземпляра класса
Чтобы создать экземпляр класса, используйте ключевое слово new, за которым следует имя класса. Синтаксис для того же приведен ниже —
Синтаксис
var object_name = new class_name([ arguments ])
-
Новое ключевое слово отвечает за создание экземпляров.
-
Правая часть выражения вызывает конструктор. В конструктор должны быть переданы значения, если он параметризован.
Новое ключевое слово отвечает за создание экземпляров.
Правая часть выражения вызывает конструктор. В конструктор должны быть переданы значения, если он параметризован.
Пример: создание класса
var obj = new Car("Engine 1")
Доступ к атрибутам и функциям
Атрибуты и функции класса могут быть доступны через объект. Использовать ‘.’ точечная нотация (называемая точкой) для доступа к данным членов класса.
//accessing an attribute obj.field_name //accessing a function obj.function_name()
пример
Посмотрите на следующий пример, чтобы понять, как получить доступ к атрибутам и функциям в Dart.
void main() { Car c= new Car(); c.disp(); } class Car { // field String engine = "E1001"; // function void disp() { print(engine); } }
Вывод вышеуказанного кода выглядит следующим образом:
E1001
Дротики конструкторы
Конструктор — это специальная функция класса, которая отвечает за инициализацию переменных класса. Дарт определяет конструктор с тем же именем, что и у класса. Конструктор является функцией и, следовательно, может быть параметризован. Однако, в отличие от функции, конструкторы не могут иметь возвращаемый тип. Если вы не объявляете конструктор, вам предоставляется конструктор по умолчанию без аргументов .
Синтаксис
Class_name(parameter_list) { //constructor body }
пример
В следующем примере показано, как использовать конструкторы в Dart —
void main() { Car c = new Car('E1001'); } class Car { Car(String engine) { print(engine); } }
Он должен произвести следующий вывод —
E1001
Именованные Конструкторы
Dart предоставляет именованные конструкторы, позволяющие классу определять несколько конструкторов . Синтаксис именованных конструкторов приведен ниже.
Синтаксис: определение конструктора
Class_name.constructor_name(param_list)
пример
В следующем примере показано, как вы можете использовать именованные конструкторы в Dart —
void main() { Car c1 = new Car.namedConst('E1001'); Car c2 = new Car(); } class Car { Car() { print("Non-parameterized constructor invoked"); } Car.namedConst(String engine) { print("The engine is : ${engine}"); } }
Он должен произвести следующий вывод —
The engine is : E1001 Non-parameterized constructor invoked
Это ключевое слово
Ключевое слово this ссылается на текущий экземпляр класса. Здесь имя параметра и имя поля класса совпадают. Следовательно, чтобы избежать двусмысленности, поле класса начинается с ключевого слова this . Следующий пример объясняет то же самое —
пример
В следующем примере объясняется, как использовать ключевое слово this в Dart —
void main() { Car c1 = new Car('E1001'); } class Car { String engine; Car(String engine) { this.engine = engine; print("The engine is : ${engine}"); } }
Он должен произвести следующий вывод —
The engine is : E1001
Класс дротиков ─ добытчики и сеттеры
Методы получения и установки, также называемые аксессорами и мутаторами , позволяют программе инициализировать и извлекать значения полей класса соответственно. Получатели или методы доступа определяются с помощью ключевого слова get . Сеттеры или мутаторы определяются с помощью ключевого слова set .
Получатель / установщик по умолчанию связан с каждым классом. Однако значения по умолчанию могут быть переопределены путем явного определения метода установки / получения. Получатель не имеет параметров и возвращает значение, а установщик имеет один параметр и не возвращает значение.
Синтаксис: определение геттера
Return_type get identifier { }
Синтаксис: определение сеттера
set identifier { }
пример
В следующем примере показано, как вы можете использовать геттеры и сеттеры в классе Dart —
class Student { String name; int age; String get stud_name { return name; } void set stud_name(String name) { this.name = name; } void set stud_age(int age) { if(age<= 0) { print("Age should be greater than 5"); } else { this.age = age; } } int get stud_age { return age; } } void main() { Student s1 = new Student(); s1.stud_name = 'MARK'; s1.stud_age = 0; print(s1.stud_name); print(s1.stud_age); }
Этот программный код должен выдать следующий вывод:
Age should be greater than 5 MARK Null
Наследование классов
Дарт поддерживает концепцию наследования, которая заключается в способности программы создавать новые классы из существующего класса. Класс, расширенный для создания более новых классов, называется родительским классом / суперклассом. Вновь созданные классы называются дочерними / подклассами.
Класс наследуется от другого класса с помощью ключевого слова extends. Дочерние классы наследуют все свойства и методы, кроме конструкторов, от родительского класса .
Синтаксис
class child_class_name extends parent_class_name
Примечание. Dart не поддерживает множественное наследование.
Пример: наследование классов
В следующем примере мы объявляем класс Shape . Класс расширен классом Circle . Поскольку между классами существуют отношения наследования, дочерний класс, т. Е. Класс Car, получает неявный доступ к своему члену данных родительского класса.
void main() { var obj = new Circle(); obj.cal_area(); } class Shape { void cal_area() { print("calling calc area defined in the Shape class"); } } class Circle extends Shape {}
Он должен произвести следующий вывод —
calling calc area defined in the Shape class
Типы Наследования
Наследование может быть следующих трех типов:
-
Single — каждый класс может быть максимально расширен от одного родительского класса.
-
Несколько — класс может наследоваться от нескольких классов. Дарт не поддерживает множественное наследование.
-
Многоуровневый — класс может наследовать от другого дочернего класса.
Single — каждый класс может быть максимально расширен от одного родительского класса.
Несколько — класс может наследоваться от нескольких классов. Дарт не поддерживает множественное наследование.
Многоуровневый — класс может наследовать от другого дочернего класса.
пример
В следующем примере показано, как работает многоуровневое наследование.
void main() { var obj = new Leaf(); obj.str = "hello"; print(obj.str); } class Root { String str; } class Child extends Root {} class Leaf extends Child {} //indirectly inherits from Root by virtue of inheritance
Класс Leaf извлекает атрибуты из классов Root и Child посредством многоуровневого наследования. Его вывод выглядит следующим образом —
hello
Dart — наследование класса и переопределение метода
Переопределение метода — это механизм, с помощью которого дочерний класс переопределяет метод в своем родительском классе. Следующий пример иллюстрирует то же самое —
пример
void main() { Child c = new Child(); c.m1(12); } class Parent { void m1(int a){ print("value of a ${a}");} } class Child extends Parent { @override void m1(int b) { print("value of b ${b}"); } }
Он должен произвести следующий вывод —
value of b 12
Число и тип параметров функции должны совпадать при переопределении метода. В случае несоответствия в количестве параметров или их типе данных компилятор Dart выдает ошибку. Следующая иллюстрация объясняет то же самое —
import 'dart:io'; void main() { Child c = new Child(); c.m1(12); } class Parent { void m1(int a){ print("value of a ${a}");} } class Child extends Parent { @override void m1(String b) { print("value of b ${b}"); } }
Он должен произвести следующий вывод —
value of b 12
Статическое ключевое слово
Ключевое слово static может применяться к членам данных класса, т. Е. К полям и методам . Статическая переменная сохраняет свои значения, пока программа не завершит выполнение. На статические члены ссылается имя класса.
пример
class StaticMem { static int num; static disp() { print("The value of num is ${StaticMem.num}") ; } } void main() { StaticMem.num = 12; // initialize the static variable } StaticMem.disp(); // invoke the static method }
Он должен произвести следующий вывод —
The value of num is 12
Супер Ключевое слово
Ключевое слово super используется для ссылки на непосредственного родителя класса. Ключевое слово может использоваться для ссылки на версию класса , свойства или метода суперкласса. Следующий пример иллюстрирует то же самое —
пример
void main() { Child c = new Child(); c.m1(12); } class Parent { String msg = "message variable from the parent class"; void m1(int a){ print("value of a ${a}");} } class Child extends Parent { @override void m1(int b) { print("value of b ${b}"); super.m1(13); print("${super.msg}") ; } }
Он должен произвести следующий вывод —
value of b 12 value of a 13 message variable from the parent class
Дартс Программирование — Объект
Объектно-ориентированное программирование определяет объект как «любой объект, имеющий определенную границу». Объект имеет следующее:
-
Состояние — описывает объект. Поля класса представляют состояние объекта.
-
Поведение — описывает, что может сделать объект.
-
Идентичность — уникальное значение, которое отличает объект от набора похожих других объектов. Два или более объекта могут иметь общее состояние и поведение, но не идентичность.
Состояние — описывает объект. Поля класса представляют состояние объекта.
Поведение — описывает, что может сделать объект.
Идентичность — уникальное значение, которое отличает объект от набора похожих других объектов. Два или более объекта могут иметь общее состояние и поведение, но не идентичность.
Оператор точки (.) Используется вместе с объектом для доступа к элементам данных класса.
пример
Дротик представляет данные в виде объектов. Каждый класс в Dart расширяет класс Object. Ниже приведен простой пример создания и использования объекта.
class Student { void test_method() { print("This is a test method"); } void test_method1() { print("This is a test method1"); } } void main() { Student s1 = new Student(); s1.test_method(); s1.test_method1(); }
Он должен произвести следующий вывод —
This is a test method This is a test method1
Каскадный оператор (..)
Приведенный выше пример вызывает методы в классе. Однако каждый раз, когда вызывается функция, требуется ссылка на объект. Каскадный оператор может использоваться как сокращение в тех случаях, когда существует последовательность вызовов.
Оператор cascade (..) может использоваться для выдачи последовательности вызовов через объект. Приведенный выше пример может быть переписан следующим образом.
class Student { void test_method() { print("This is a test method"); } void test_method1() { print("This is a test method1"); } } void main() { new Student() ..test_method() ..test_method1(); }
Он должен произвести следующий вывод —
This is a test method This is a test method1
Метод toString ()
Эта функция возвращает строковое представление объекта. Посмотрите на следующий пример, чтобы понять, как использовать метод toString .
void main() { int n = 12; print(n.toString()); }
Он должен произвести следующий вывод —
12
Дартс программирование — коллекция
Дарт, в отличие от других языков программирования, не поддерживает массивы. Коллекции дротиков можно использовать для репликации структур данных, таких как массив. Библиотека dart: core и другие классы включают поддержку Collection в сценариях Dart.
Коллекции дротиков можно в основном классифицировать как —
Sr.No | Коллекция дартс и описание |
---|---|
1 | Список
Список — это просто упорядоченная группа объектов. Библиотека dart: core предоставляет класс List, который позволяет создавать списки и управлять ими.
|
2 | Задавать
Набор представляет собой набор объектов, в котором каждый объект может встречаться только один раз. Библиотека dart: core предоставляет класс Set для реализации того же самого. |
3 | Карты
Объект Map представляет собой простую пару ключ / значение. Ключи и значения на карте могут быть любого типа. Карта — это динамическая коллекция. Другими словами, Карты могут расти и уменьшаться во время выполнения. Класс Map в библиотеке dart: core обеспечивает такую же поддержку. |
4 | Очередь
Очередь — это коллекция, которой можно манипулировать на обоих концах. Очереди полезны, когда вы хотите создать коллекцию «первым пришел — первым вышел». Проще говоря, очередь вставляет данные с одного конца и удаляет с другого конца. Значения удаляются / читаются в порядке их вставки. |
Список — это просто упорядоченная группа объектов. Библиотека dart: core предоставляет класс List, который позволяет создавать списки и управлять ими.
Список фиксированной длины — длина списка не может изменяться во время выполнения.
Растущий список — длина списка может меняться во время выполнения.
Набор представляет собой набор объектов, в котором каждый объект может встречаться только один раз. Библиотека dart: core предоставляет класс Set для реализации того же самого.
Объект Map представляет собой простую пару ключ / значение. Ключи и значения на карте могут быть любого типа. Карта — это динамическая коллекция. Другими словами, Карты могут расти и уменьшаться во время выполнения. Класс Map в библиотеке dart: core обеспечивает такую же поддержку.
Очередь — это коллекция, которой можно манипулировать на обоих концах. Очереди полезны, когда вы хотите создать коллекцию «первым пришел — первым вышел». Проще говоря, очередь вставляет данные с одного конца и удаляет с другого конца. Значения удаляются / читаются в порядке их вставки.
Итерация коллекций
Класс Iterator из библиотеки dart: core позволяет легко обойти коллекцию. Каждая коллекция имеет свойство итератора . Это свойство возвращает итератор, который указывает на объекты в коллекции.
пример
Следующий пример иллюстрирует обход коллекции с использованием объекта итератора.
импорт «дартс: коллекция»; пустая функция() { Queue numQ = новая очередь (); numQ.addAll ([100200300]); Iterator i = numQ.iterator; while (i.moveNext ()) { печать (i.current); } }
Функция moveNext () возвращает логическое значение, указывающее, есть ли последующая запись. Текущее свойство объекта итератора возвращает значение объекта, на который в данный момент указывает итератор.
Эта программа должна выдать следующий результат:
100 200 300
Дартс Программирование — Дженерики
Дарт — необязательный типизированный язык . Коллекции в Dart по умолчанию неоднородны. Другими словами, одна коллекция Dart может содержать значения различных типов. Тем не менее, коллекция Dart может быть сделана для хранения однородных значений. Концепция Generics может быть использована для достижения того же.
Использование Generics налагает ограничение на тип данных значений, которые могут содержаться в коллекции. Такие коллекции называются типобезопасными коллекциями. Безопасность типов — это функция программирования, которая гарантирует, что блок памяти может содержать данные только определенного типа.
Все коллекции Dart поддерживают реализацию безопасности типов посредством обобщений. Пара угловых скобок, содержащих тип данных, используется для объявления безопасной для типов коллекции. Синтаксис для объявления типобезопасной коллекции приведен ниже.
Синтаксис
Collection_name <data_type> identifier= new Collection_name<data_type>
Типобезопасные реализации List, Map, Set и Queue приведены ниже. Эта функция также поддерживается всеми реализациями вышеупомянутых типов коллекций.
Пример: общий список
пустая функция() { List <String> logTypes = new List <String> (); logTypes.add ( "ВНИМАНИЕ"); logTypes.add ( "ERROR"); logTypes.add ( "INFO"); // перебираем список for (строковый тип в logTypes) { печать (тип); } }
Он должен произвести следующий вывод —
WARNING ERROR INFO
Попытка вставить значение, отличное от указанного типа, приведет к ошибке компиляции. Следующий пример иллюстрирует это.
пример
void main() { List <String> logTypes = new List <String>(); logTypes.add(1); logTypes.add("ERROR"); logTypes.add("INFO"); //iterating across list for (String type in logTypes) { print(type); } }
Он должен произвести следующий вывод —
1 ERROR INFO
Пример: общий набор
void main() { Set <int>numberSet = new Set<int>(); numberSet.add(100); numberSet.add(20); numberSet.add(5); numberSet.add(60); numberSet.add(70); // numberSet.add("Tom"); compilation error; print("Default implementation :${numberSet.runtimeType}"); for(var no in numberSet) { print(no); } }
Он должен произвести следующий вывод —
Default implementation :_CompactLinkedHashSet<int> 100 20 5 60 70
Пример: общая очередь
импорт «дартс: коллекция»; пустая функция() { Queue <int> queue = новая очередь <int> (); print ("Реализация по умолчанию $ {queue.runtimeType}"); queue.addLast (10); queue.addLast (20); queue.addLast (30); queue.addLast (40); queue.removeFirst (); for (int нет в очереди) { печать (нет); } }
Он должен произвести следующий вывод —
Default implementation ListQueue<int> 20 30 40
Общая карта
Безопасное объявление типа определяет типы данных —
- Ключ
- Значение
Синтаксис
Map <Key_type, value_type>
пример
пустая функция() { Карта <String, String> m = {'name': 'Tom', 'Id': 'E1001'}; print ('Карта: $ {m}'); }
Он должен произвести следующий вывод —
Map :{name: Tom, Id: E1001}
Дарт Программирование — Пакеты
Пакет — это механизм для инкапсуляции группы программных модулей. Временами приложения могут нуждаться в интеграции некоторых сторонних библиотек или плагинов. Каждый язык имеет механизм для управления внешними пакетами, такими как Maven или Gradle для Java, Nuget для .NET, npm для Node.js и т. Д. Менеджер пакетов для Dart — это pub .
Паб помогает устанавливать пакеты в хранилище. Хранилище размещенных пакетов можно найти по адресу https://pub.dartlang.org/.
Метаданные пакета определены в файле pubsec.yaml . YAML — это сокращение от еще одного языка разметки . Инструмент pub может использоваться для загрузки всех различных библиотек, которые требуются приложению.
Каждое приложение Dart имеет файл pubspec.yaml, который содержит зависимости приложения от других библиотек и метаданные приложений, такие как имя приложения, автор, версия и описание.
Содержимое файла pubspec.yaml должно выглядеть примерно так:
name: 'vector_victor' version: 0.0.1 description: An absolute bare-bones web app. ... dependencies: browser: '>=0.10.0 <0.11.0'
Важные команды паба следующие:
Sr.No | Команда и описание |
---|---|
1 |
‘паб получить’ Помогает получить все пакеты, от которых зависит ваше приложение. |
2 |
«Обновление паба» Обновляет все ваши зависимости до более новой версии. |
3 |
‘паб билд’ Это используется для создания вашего веб-приложения, и оно создаст папку для сборки со всеми связанными скриптами в ней. |
4 |
«Помощь паба» Это даст вам помощь для всех команд паба. |
‘паб получить’
Помогает получить все пакеты, от которых зависит ваше приложение.
«Обновление паба»
Обновляет все ваши зависимости до более новой версии.
‘паб билд’
Это используется для создания вашего веб-приложения, и оно создаст папку для сборки со всеми связанными скриптами в ней.
«Помощь паба»
Это даст вам помощь для всех команд паба.
Если вы используете IDE, такую как WebStorm, вы можете щелкнуть правой кнопкой мыши на pubspec.yaml, чтобы получить все команды напрямую —
Установка пакета
Рассмотрим пример, в котором приложению необходимо проанализировать xml. Dart XML — это легковесная библиотека с открытым исходным кодом, стабильная для анализа, обхода, запросов и построения XML-документов.
Шаги для достижения указанной задачи следующие:
Шаг 1 — Добавьте следующее в файл pubsec.yaml.
name: TestApp version: 0.0.1 description: A simple console application. #dependencies: # foo_bar: '>=1.0.0 <2.0.0' dependencies: https://mail.google.com/mail/u/0/images/cleardot.gif xml:
Щелкните правой кнопкой мыши на pubsec.yaml и получите зависимости. Это приведет к внутреннему запуску команды pub get, как показано ниже.
Загруженные пакеты и их зависимые пакеты можно проверить в папке пакетов.
Поскольку установка завершена сейчас, нам нужно сослаться на dart xml в проекте. Синтаксис выглядит следующим образом —
импортировать «пакет: xml / xml.dart» как xml;
Читать XML-строку
Чтобы прочитать строку XML и проверить ввод, Dart XML использует метод parse () . Синтаксис выглядит следующим образом —
xml.parse(String input):
Пример: синтаксический анализ ввода XML-строки
В следующем примере показано, как проанализировать ввод XML-строки —
импортировать «пакет: xml / xml.dart» как xml; пустая функция(){ печать ( "XML"); var bookshelfXml = '' '<? xml version = "1.0"?> <Книжная полка> <Книга> <title lang = "english"> Развитие языка </ title> <Цена> 29,99 <цена /> </ Книга> <Книга> <title lang = "english"> изучение XML </ title> <Цена> 39,95 <цена /> </ Книга> <Цена> 132,00 </ цена> </ Книжная полка> '' '; var document = xml.parse (bookshelfXml); печати (document.toString ()); }
Он должен произвести следующий вывод —
xml <?xml version = "1.0"?><bookshelf> <book> <title lang = "english">Growing a Language</title> <price>29.99</price> </book> <book> <title lang = "english">Learning XML</title> <price>39.95</price> </book> <price>132.00</price> </bookshelf>
Программирование дротиков — исключения
Исключение (или исключительное событие) — это проблема, возникающая во время выполнения программы. Когда возникает исключение, нормальный поток программы прерывается, и программа / приложение ненормально завершается.
Встроенные исключения Dart включают —
Sr.No | Исключения и описание |
---|---|
1 |
DeferredLoadException Выдается, когда не удается загрузить отложенную библиотеку. |
2 |
FormatException Исключение выдается, когда строка или некоторые другие данные не имеют ожидаемого формата и не могут быть проанализированы или обработаны. |
3 |
IntegerDivisionByZeroException Брошенный, когда число делится на ноль. |
4 |
IOException Базовый класс для всех исключений, связанных с Inupt-Output. |
5 |
IsolateSpawnException Брошенный, когда изолят не может быть создан. |
6 |
Тайм — аут Брошенный, когда запланированный тайм-аут случается, ожидая асинхронного результата. |
DeferredLoadException
Выдается, когда не удается загрузить отложенную библиотеку.
FormatException
Исключение выдается, когда строка или некоторые другие данные не имеют ожидаемого формата и не могут быть проанализированы или обработаны.
IntegerDivisionByZeroException
Брошенный, когда число делится на ноль.
IOException
Базовый класс для всех исключений, связанных с Inupt-Output.
IsolateSpawnException
Брошенный, когда изолят не может быть создан.
Тайм — аут
Брошенный, когда запланированный тайм-аут случается, ожидая асинхронного результата.
Каждое исключение в Dart является подтипом предопределенного класса Exception . Исключения должны быть обработаны, чтобы предотвратить внезапное завершение приложения.
Блоки try / on / catch
Блок try встраивает код, который может привести к исключению. Блок on используется, когда необходимо указать тип исключения. Блок catch используется, когда обработчику нужен объект исключения.
За блоком try должен следовать либо один блок on / catch, либо один блок finally (или один из обоих). Когда в блоке try возникает исключение, управление передается в catch .
Синтаксис для обработки исключения приведен ниже.
try { // code that might throw an exception } on Exception1 { // code for handling exception } catch Exception2 { // code for handling exception }
Ниже приведены некоторые моменты, которые следует помнить —
-
Фрагмент кода может иметь более одного блока on / catch для обработки нескольких исключений.
-
Блок on и блок catch являются взаимоисключающими, то есть блок try может быть связан как с блоком on, так и с блоком catch.
Фрагмент кода может иметь более одного блока on / catch для обработки нескольких исключений.
Блок on и блок catch являются взаимоисключающими, то есть блок try может быть связан как с блоком on, так и с блоком catch.
Следующий код иллюстрирует обработку исключений в Dart —
Пример: использование блока ON
Следующая программа делит два числа, представленные переменными x и y соответственно. Код генерирует исключение, так как он пытается делить на ноль. Блок on содержит код для обработки этого исключения.
main() { int x = 12; int y = 0; int res; try { res = x ~/ y; } on IntegerDivisionByZeroException { print('Cannot divide by zero'); } }
Он должен произвести следующий вывод —
Cannot divide by zero
Пример: использование блока catch
В следующем примере мы использовали тот же код, что и выше. Единственное отличие состоит в том, что блок catch (вместо блока ON) здесь содержит код для обработки исключения. Параметр catch содержит объект исключения, выданный во время выполнения.
main() { int x = 12; int y = 0; int res; try { res = x ~/ y; } catch(e) { print(e); } }
Он должен произвести следующий вывод —
IntegerDivisionByZeroException
Пример: на… поймать
В следующем примере показано, как использовать блок on … catch .
main() { int x = 12; int y = 0; int res; try { res = x ~/ y; } on IntegerDivisionByZeroException catch(e) { print(e); } }
Он должен произвести следующий вывод —
IntegerDivisionByZeroException
Последний блок
Блок finally включает в себя код, который должен выполняться независимо от возникновения исключения. Необязательный блок finally выполняется безоговорочно после try / on / catch .
Синтаксис для использования блока finally таков:
try { // code that might throw an exception } on Exception1 { // exception handling code } catch Exception2 { // exception handling } finally { // code that should always execute; irrespective of the exception }
Следующий пример иллюстрирует использование блока finally .
main() { int x = 12; int y = 0; int res; try { res = x ~/ y; } on IntegerDivisionByZeroException { print('Cannot divide by zero'); } finally { print('Finally block executed'); } }
Он должен произвести следующий вывод —
Cannot divide by zero Finally block executed
Бросать исключение
Ключевое слово throw используется для явного вызова исключения. Возникшее исключение должно быть обработано, чтобы предотвратить внезапный выход из программы.
Синтаксис для явного вызова исключения —
throw new Exception_name()
пример
В следующем примере показано, как использовать ключевое слово throw для исключения:
main() { try { test_age(-2); } catch(e) { print('Age cannot be negative'); } } void test_age(int age) { if(age<0) { throw new FormatException(); } }
Он должен произвести следующий вывод —
Age cannot be negative
Пользовательские исключения
Как указано выше, каждый тип исключения в Dart является подтипом встроенного класса Exception . Dart позволяет создавать пользовательские исключения, расширяя существующие. Синтаксис для определения пользовательского исключения приведен ниже.
Синтаксис: определение исключения
class Custom_exception_Name implements Exception { // can contain constructors, variables and methods }
Пользовательские исключения должны создаваться явно, и то же самое должно обрабатываться в коде.
пример
В следующем примере показано, как определить и обработать пользовательское исключение.
class AmtException implements Exception { String errMsg() => 'Amount should be greater than zero'; } void main() { try { withdraw_amt(-1); } catch(e) { print(e.errMsg()); } finally { print('Ending requested operation.....'); } } void withdraw_amt(int amt) { if (amt <= 0) { throw new AmtException(); } }
В приведенном выше коде мы определяем пользовательское исключение AmtException . Код вызывает исключение, если переданная сумма находится за пределами допустимого диапазона. Основная функция включает вызов функции в блоке try … catch .
Код должен выдать следующий вывод:
Amount should be greater than zero Ending requested operation....
Дартс программирование — отладка
Время от времени разработчики допускают ошибки при кодировании. Ошибка в программе называется ошибкой. Процесс поиска и исправления ошибок называется отладкой и является обычной частью процесса разработки. В этом разделе рассматриваются инструменты и методы, которые могут помочь вам в решении задач отладки.
Редактор WebStorm включает точки останова и пошаговую отладку. Программа будет прервана в той точке, где установлена точка останова. Эта функциональность похожа на то, что вы можете ожидать от разработки приложений на Java или C #. Вы можете просматривать переменные, просматривать стек, переходить и переходить к вызовам методов и функций — все это из редактора WebStorm.
Добавление точки останова
Рассмотрим следующий фрагмент кода. (TestString.dart)
void main() { int a = 10, b = 20, c = 5; c = c * c * c; print("$a + $b = ${a+b}"); print("$a%$b = ${a%b}"); // Add a break point here print("$a*$b = ${a*b}"); print("$a/$b = ${a/b}"); print(c); }
Чтобы добавить точку останова , нажмите на левое поле для. На рисунке, приведенном ниже, строка № 7 имеет точку разрыва.
Запустите программу в режиме отладки . В проводнике проекта щелкните правой кнопкой мыши по программе dart в нашем случае TestString.dart.
Как только программа запустится в режиме отладки, вы получите окно отладчика, как показано на следующем снимке экрана. Вкладка переменных показывает значения переменных в текущем контексте. Вы можете добавить наблюдатели для определенных переменных и прослушивать изменения этих значений, используя окно наблюдений.
Значок стрелки Step Into (F7) в меню отладки помогает выполнять код по одной инструкции за раз. Если основные методы вызывают подпрограмму, то это также входит в код подпрограммы.
Переступить (F8): Это похоже на Step Into . Разница в использовании возникает, когда текущий оператор содержит вызов подпрограммы. Если основной метод вызывает подпрограмму, переход через шаг не приведет к детализации подпрограммы. это пропустит подпрограмму.
Step Out (Shift + F8): выполняет оставшиеся строки функции, в которой находится текущая точка выполнения. Следующим отображаемым оператором является оператор, следующий за вызовом подпрограммы.
После запуска в режиме отладки программа выдаст следующий вывод:
10 + 20 = 30 10 % 20 = 10 10 * 20 = 200 10 / 20 = 0.5 125
Программирование дротиков — Typedef
Typedef , или псевдоним типа функции, помогает определять указатели на исполняемый код в памяти. Проще говоря, typedef может использоваться как указатель, который ссылается на функцию.
Ниже приведены шаги для реализации typedefs в программе Dart.
Шаг 1: Определение typedef
Typedef может использоваться для указания сигнатуры функции, которой мы хотим, чтобы определенные функции соответствовали. Сигнатура функции определяется параметрами функции (включая их типы). Тип возвращаемого значения не является частью сигнатуры функции. Его синтаксис выглядит следующим образом.
typedef function_name(parameters)
Шаг 2: Присвоение функции переменной типа
Переменная typedef может указывать на любую функцию, имеющую ту же сигнатуру, что и typedef . Вы можете использовать следующую сигнатуру для назначения функции переменной typedef .
type_def var_name = function_name
Шаг 3: вызов функции
Переменная typedef может использоваться для вызова функций. Вот как вы можете вызвать функцию —
var_name(parameters)
пример
Давайте теперь возьмем пример, чтобы понять больше о typedef в Dart.
Сначала давайте определим typedef . Здесь мы определяем сигнатуру функции. Функция будет принимать два входных параметра типа integer . Тип возвращаемого значения не является частью сигнатуры функции.
typedef ManyOperation(int firstNo , int secondNo); //function signature
Далее давайте определим функции. Определите некоторые функции с той же сигнатурой функции, что и для typeOf типа ManyOperation .
Add(int firstNo,int second){ print("Add result is ${firstNo+second}"); } Subtract(int firstNo,int second){ print("Subtract result is ${firstNo-second}"); } Divide(int firstNo,int second){ print("Add result is ${firstNo/second}"); }
Наконец, мы вызовем функцию через typedef . Объявите переменную типа ManyOperations. Присвойте имя функции объявленной переменной.
ManyOperation oper ; //can point to any method of same signature oper = Add; oper(10,20); oper = Subtract; oper(30,20); oper = Divide; oper(50,5);
Переменная oper может указывать на любой метод, который принимает два целочисленных параметра. Ссылка на функцию Add присваивается переменной. Typedefs может переключать ссылки на функции во время выполнения
Давайте теперь соберем все части вместе и посмотрим всю программу.
typedef ManyOperation(int firstNo , int secondNo); //function signature Add(int firstNo,int second){ print("Add result is ${firstNo+second}"); } Subtract(int firstNo,int second){ print("Subtract result is ${firstNo-second}"); } Divide(int firstNo,int second){ print("Divide result is ${firstNo/second}"); } Calculator(int a, int b, ManyOperation oper){ print("Inside calculator"); oper(a,b); } void main(){ ManyOperation oper = Add; oper(10,20); oper = Subtract; oper(30,20); oper = Divide; oper(50,5); }
Программа должна выдать следующий результат:
Add result is 30 Subtract result is 10 Divide result is 10.0
Примечание. Приведенный выше код приведет к ошибке, если переменная typedef попытается указать на функцию с другой сигнатурой функции.
пример
Typedefs также могут быть переданы в качестве параметра функции. Рассмотрим следующий пример —
typedef ManyOperation(int firstNo , int secondNo); //function signature Add(int firstNo,int second){ print("Add result is ${firstNo+second}"); } Subtract(int firstNo,int second){ print("Subtract result is ${firstNo-second}"); } Divide(int firstNo,int second){ print("Divide result is ${firstNo/second}"); } Calculator(int a,int b ,ManyOperation oper){ print("Inside calculator"); oper(a,b); } main(){ Calculator(5,5,Add); Calculator(5,5,Subtract); Calculator(5,5,Divide); }
Это даст следующий результат —
Inside calculator Add result is 10 Inside calculator Subtract result is 0 Inside calculator Divide result is 1.0
Дартс Программирование — Библиотеки
Библиотека на языке программирования представляет собой набор процедур (набор инструкций по программированию). Dart имеет набор встроенных библиотек, которые полезны для хранения часто используемых подпрограмм. Библиотека Dart состоит из набора классов, констант, функций, определений типов, свойств и исключений.
Импорт библиотеки
Импорт делает компоненты в библиотеке доступными для кода вызывающей стороны. Ключевое слово import используется для достижения того же. Файл дротика может иметь несколько операторов импорта.
Встроенные URI библиотеки Dart используют схему dart: для ссылки на библиотеку. Другие библиотеки могут использовать путь к файловой системе или схему package: для указания своего URI. Библиотеки, предоставляемые менеджером пакетов, таким как инструмент публикации, используют схему package : .
Синтаксис для импорта библиотеки в Dart приведен ниже —
import 'URI'
Рассмотрим следующий фрагмент кода —
import 'dart:io' import 'package:lib1/libfile.dart'
Если вы хотите использовать только часть библиотеки, вы можете выборочно импортировать библиотеку. Синтаксис для того же приведен ниже —
import 'package: lib1/lib1.dart' show foo, bar; // Import only foo and bar. import 'package: mylib/mylib.dart' hide foo; // Import all names except foo
Некоторые часто используемые библиотеки приведены ниже —
Sr.No | Библиотека и описание |
---|---|
1 |
дротик: И.О. Поддержка файлов, сокетов, HTTP и других операций ввода-вывода для серверных приложений. Эта библиотека не работает в браузерных приложениях. Эта библиотека импортируется по умолчанию. |
2 |
дротик: ядро Встроенные типы, коллекции и другие основные функции для каждой программы Dart. Эта библиотека автоматически импортируется. |
3 |
дротик: математика Математические константы и функции, плюс генератор случайных чисел. |
4 |
дротик: конвертировать Кодеры и декодеры для преобразования между различными представлениями данных, включая JSON и UTF-8. |
5 |
дротик: typed_data Списки, которые эффективно обрабатывают данные фиксированного размера (например, 8-байтовые целые числа без знака). |
дротик: И.О.
Поддержка файлов, сокетов, HTTP и других операций ввода-вывода для серверных приложений. Эта библиотека не работает в браузерных приложениях. Эта библиотека импортируется по умолчанию.
дротик: ядро
Встроенные типы, коллекции и другие основные функции для каждой программы Dart. Эта библиотека автоматически импортируется.
дротик: математика
Математические константы и функции, плюс генератор случайных чисел.
дротик: конвертировать
Кодеры и декодеры для преобразования между различными представлениями данных, включая JSON и UTF-8.
дротик: typed_data
Списки, которые эффективно обрабатывают данные фиксированного размера (например, 8-байтовые целые числа без знака).
Пример: импорт и использование библиотеки
В следующем примере импортируется встроенная библиотека dart: math . Фрагмент вызывает функцию sqrt () из математической библиотеки. Эта функция возвращает квадратный корень переданного ей числа.
import 'dart:math'; void main() { print("Square root of 36 is: ${sqrt(36)}"); }
Выход
Square root of 36 is: 6.0
Инкапсуляция в библиотеках
Скрипты Dart могут ставить перед идентификаторами символ подчеркивания (_), чтобы пометить его компоненты как частные. Проще говоря, библиотеки Dart могут ограничивать доступ к его содержимому с помощью внешних скриптов. Это называется инкапсуляцией . Синтаксис для того же приведен ниже —
Синтаксис
_identifier
пример
Сначала определите библиотеку с частной функцией.
library loggerlib; void _log(msg) { print("Log method called in loggerlib msg:$msg"); }
Далее импортируем библиотеку
import 'test.dart' as web; void main() { web._log("hello from webloggerlib"); }
Приведенный выше код приведет к ошибке.
Unhandled exception: No top-level method 'web._log' declared. NoSuchMethodError: method not found: 'web._log' Receiver: top-level Arguments: [...] #0 NoSuchMethodError._throwNew (dart:core-patch/errors_patch.dart:184) #1 main (file:///C:/Users/Administrator/WebstormProjects/untitled/Assertion.dart:6:3) #2 _startIsolate.<anonymous closure> (dart:isolate-patch/isolate_patch.dart:261) #3 _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:148)
Создание пользовательских библиотек
Дарт также позволяет использовать свой собственный код в качестве библиотеки. Создание пользовательской библиотеки включает в себя следующие шаги:
Шаг 1: Объявление библиотеки
Чтобы явно объявить библиотеку, используйте оператор библиотеки . Синтаксис объявления библиотеки приведен ниже.
library library_name // library contents go here
Шаг 2: ассоциирование библиотеки
Вы можете связать библиотеку двумя способами —
- В том же каталоге
import 'library_name'
- Из другого каталога
import 'dir/library_name'
Пример: пользовательская библиотека
Сначала давайте определим пользовательскую библиотеку calculator.dart .
library calculator_lib; import 'dart:math'; //import statement after the libaray statement int add(int firstNumber,int secondNumber){ print("inside add method of Calculator Library ") ; return firstNumber+secondNumber; } int modulus(int firstNumber,int secondNumber){ print("inside modulus method of Calculator Library ") ; return firstNumber%secondNumber; } int random(int no){ return new Random().nextInt(no); }
Далее мы импортируем библиотеку —
import 'calculator.dart'; void main() { var num1 = 10; var num2 = 20; var sum = add(num1,num2); var mod = modulus(num1,num2); var r = random(10); print("$num1 + $num2 = $sum"); print("$num1 % $num2= $mod"); print("random no $r"); }
Программа должна выдать следующий результат:
inside add method of Calculator Library inside modulus method of Calculator Library 10 + 20 = 30 10 % 20= 10 random no 0
Префикс библиотеки
Если вы импортируете две библиотеки с конфликтующими идентификаторами, то вы можете указать префикс для одной или обеих библиотек. Используйте ключевое слово «as» для указания префикса. Синтаксис для того же приведен ниже —
Синтаксис
import 'library_uri' as prefix
пример
Сначала давайте определим библиотеку: loggerlib.dart .
library loggerlib; void log(msg){ print("Log method called in loggerlib msg:$msg"); }
Далее мы определим другую библиотеку: webloggerlib.dart .
library webloggerlib; void log(msg){ print("Log method called in webloggerlib msg:$msg"); }
Наконец, мы импортируем библиотеку с префиксом.
import 'loggerlib.dart'; import 'webloggerlib.dart' as web; // prefix avoids function name clashes void main(){ log("hello from loggerlib"); web.log("hello from webloggerlib"); }
Это даст следующий результат —
Log method called in loggerlib msg:hello from loggerlib Log method called in webloggerlib msg:hello from webloggerlib
Программирование дротиков — Async
Асинхронная операция выполняется в потоке, отдельном от основного потока приложения. Когда приложение вызывает метод для выполнения операции асинхронно, приложение может продолжить выполнение, пока асинхронный метод выполняет свою задачу.
пример
Давайте рассмотрим пример, чтобы понять эту концепцию. Здесь программа принимает пользовательский ввод с использованием библиотеки IO .
import 'dart:io'; void main() { print("Enter your name :"); // prompt for user input String name = stdin.readLineSync(); // this is a synchronous method that reads user input print("Hello Mr. ${name}"); print("End of main"); }
ReadLineSync () является синхронным методом. Это означает, что выполнение всех инструкций, следующих за вызовом функции readLineSync (), будет заблокировано, пока метод readLineSync () не завершит выполнение.
Stdin.readLineSync ожидает ввода. Он останавливается на своих треках и больше не выполняется, пока не получит ввод от пользователя.
Приведенный выше пример приведет к следующему выводу:
Enter your name : Tom // reads user input Hello Mr. Tom End of main
В вычислениях мы говорим, что что-то синхронно, когда оно ожидает события, прежде чем продолжить. Недостатком этого подхода является то, что если выполнение части кода занимает слишком много времени, последующие блоки, хотя и не связанные, будут заблокированы для выполнения. Рассмотрим веб-сервер, который должен отвечать на несколько запросов на ресурс.
Модель синхронного выполнения будет блокировать каждый запрос другого пользователя, пока не завершит обработку текущего запроса. В таком случае, как и у веб-сервера, каждый запрос должен быть независимым от других. Это означает, что веб-сервер не должен ждать завершения текущего запроса, прежде чем он ответит на запрос других пользователей.
Проще говоря, он должен принимать запросы от новых пользователей, прежде чем обязательно завершить запросы предыдущих пользователей. Это называется асинхронным. Асинхронное программирование, в основном, означает отсутствие ожидающей или неблокирующей модели программирования. Пакет dart: async облегчает реализацию блоков асинхронного программирования в сценарии Dart.
пример
Следующий пример лучше иллюстрирует функционирование асинхронного блока.
Шаг 1 — Создайте файл contact.txt, как указано ниже, и сохраните его в папке данных в текущем проекте.
1, Tom 2, John 3, Tim 4, Jane
Шаг 2 — Напишите программу, которая будет читать файл, не блокируя другие части приложения.
import "dart:async"; import "dart:io"; void main(){ File file = new File( Directory.current.path+"\\data\\contact.txt"); Future<String> f = file.readAsString(); // returns a futrue, this is Async method f.then((data)=>print(data)); // once file is read , call back method is invoked print("End of main"); // this get printed first, showing fileReading is non blocking or async }
Результат этой программы будет следующим:
End of main 1, Tom 2, John 3, Tim 4, Jan
«Конец основного» выполняется первым, в то время как скрипт продолжает чтение файла. Класс Future , часть dart: async , используется для получения результата вычислений после выполнения асинхронной задачи. Это значение Future затем используется для выполнения чего-либо после завершения вычислений.
Как только операция чтения завершена, управление выполнением передается в рамках функции then () . Это потому, что операция чтения может занять больше времени, и поэтому она не хочет блокировать другую часть программы.
Дартс Будущее
Сообщество дартс определяет будущее как «средство для получения ценности когда-нибудь в будущем». Проще говоря, объекты Future представляют собой механизм для представления значений, возвращаемых выражением, выполнение которого будет завершено в более поздний момент времени. Некоторые из встроенных классов Dart возвращают Future при вызове асинхронного метода.
Дарт это однопоточный язык программирования. Если какой-либо код блокирует поток выполнения (например, из-за ожидания длительной операции или блокировки ввода-вывода), программа эффективно останавливается.
Асинхронные операции позволяют вашей программе работать без блокировки. Dart использует объекты Future для представления асинхронных операций.
Дартс программирование — параллелизм
Параллелизм — это выполнение нескольких последовательностей команд одновременно. Это включает в себя выполнение более чем одной задачи одновременно.
Дарт использует изоляты как инструмент для параллельного выполнения работ. Пакет dart: isolate представляет собой решение Dart для получения однопоточного кода Dart и позволяет приложению более широко использовать доступное аппаратное обеспечение.
Изоляты , как следует из названия, являются изолированными единицами выполняющегося кода. Единственный способ передачи данных между ними — это передача сообщений, например, как вы передаете сообщения между клиентом и сервером. Изолят помогает программе использовать преимущества многоядерных микропроцессоров из коробки.
пример
Давайте рассмотрим пример, чтобы лучше понять эту концепцию.
import 'dart:isolate'; void foo(var message){ print('execution from foo ... the message is :${message}'); } void main(){ Isolate.spawn(foo,'Hello!!'); Isolate.spawn(foo,'Greetings!!'); Isolate.spawn(foo,'Welcome!!'); print('execution from main1'); print('execution from main2'); print('execution from main3'); }
Здесь метод spawn класса Isolate облегчает запуск функции foo параллельно с остальной частью нашего кода. Функция spawn принимает два параметра —
- функция, которая будет порождена, и
- объект, который будет передан в порожденную функцию.
Если нет объекта для передачи в порожденную функцию, ему может быть передано значение NULL.
Две функции (foo и main) могут не обязательно каждый раз запускаться в одном и том же порядке. Нет никакой гарантии относительно того, когда foo будет выполняться и когда main () будет выполняться. Результат будет отличаться при каждом запуске.
Выход 1
execution from main1 execution from main2 execution from main3 execution from foo ... the message is :Hello!!
Выход 2
execution from main1 execution from main2 execution from main3 execution from foo ... the message is :Welcome!! execution from foo ... the message is :Hello!! execution from foo ... the message is :Greetings!!
Исходя из результатов, мы можем заключить, что код Dart может породить новый изолят от выполняющегося кода, как способ, которым код Java или C # может начать новый поток.
Изоляты отличаются от потоков тем, что изолят имеет свою собственную память. Невозможно разделить переменную между изолятами — единственный способ связи между изолятами — через передачу сообщений.
Примечание. Приведенный выше вывод будет различным для разных конфигураций оборудования и операционной системы.
Изолировать v / s Будущее
Выполнение сложной вычислительной работы асинхронно важно для обеспечения отзывчивости приложений. Dart Future — это механизм извлечения значения асинхронной задачи после ее завершения, в то время как Dart Isolates — это инструмент для абстрагирования параллелизма и его практической реализации на высоком уровне.
Программирование дротиков — модульное тестирование
Модульное тестирование включает в себя тестирование каждого отдельного модуля приложения. Это помогает разработчику тестировать небольшие функциональные возможности без запуска всего сложного приложения.
Внешняя библиотека Dart с именем «test» предоставляет стандартный способ написания и запуска модульных тестов.
Дарт-юнит-тестирование включает в себя следующие этапы:
Шаг 1: Установка «тестового» пакета
Для установки сторонних пакетов в текущем проекте вам потребуется файл pubspec.yaml . Чтобы установить тестовые пакеты , сначала сделайте следующую запись в файле pubspec.yaml —
dependencies: test:
Сделав запись, щелкните правой кнопкой мыши файл pubspec.yaml и получите зависимости. Он установит «тестовый» пакет. Ниже приведен скриншот для того же в редакторе WebStorm .
Пакеты также могут быть установлены из командной строки . Введите следующее в терминале —
pub get
Шаг 2: Импорт «тестового» пакета
import "package:test/test.dart";
Шаг 3 Написание тестов
Тесты задаются с помощью функции верхнего уровня test () , а тестовые утверждения выполняются с использованием функции wait () . Для использования этих методов они должны быть установлены как зависимость pub .
Синтаксис
test("Description of the test ", () { expect(actualValue , matchingValue) });
Функция group () может использоваться для группировки тестов. Описание каждой группы добавляется в начало описания ее теста.
Синтаксис
group("some_Group_Name", () { test("test_name_1", () { expect(actual, equals(exptected)); }); test("test_name_2", () { expect(actual, equals(expected)); }); })
Пример 1: Проходной тест
В следующем примере определяется метод Add () . Этот метод принимает два целочисленных значения и возвращает целое число, представляющее сумму . Чтобы проверить этот метод add () —
Шаг 1 — Импортируйте тестовый пакет, как указано ниже.
Шаг 2 — Определите тест, используя функцию test () . Здесь функция test () использует функцию wait () для принудительного подтверждения.
import 'package:test/test.dart'; // Import the test package int Add(int x,int y) // Function to be tested { return x+y; } void main() { // Define the test test("test to check add method",(){ // Arrange var expected = 30; // Act var actual = Add(10,20); // Asset expect(actual,expected); }); }
Он должен произвести следующий вывод —
00:00 +0: test to check add method 00:00 +1: All tests passed!
Пример 2: провальный тест
Метод subtract (), определенный ниже, имеет логическую ошибку. Следующий тест подтверждает то же самое.
import 'package:test/test.dart'; int Add(int x,int y){ return x+y; } int Sub(int x,int y){ return x-y-1; } void main(){ test('test to check sub',(){ var expected = 10; // Arrange var actual = Sub(30,20); // Act expect(actual,expected); // Assert }); test("test to check add method",(){ var expected = 30; // Arrange var actual = Add(10,20); // Act expect(actual,expected); // Asset }); }
Выходные данные — контрольный пример для функции add () проходит, но проверка для subtract () завершается неудачно, как показано ниже.
00:00 +0: test to check sub 00:00 +0 -1: test to check sub Expected: <10> Actual: <9> package:test expect bin\Test123.dart 18:5 main.<fn> 00:00 +0 -1: test to check add method 00:00 +1 -1: Some tests failed. Unhandled exception: Dummy exception to set exit code. #0 _rootHandleUncaughtError.<anonymous closure> (dart:async/zone.dart:938) #1 _microtaskLoop (dart:async/schedule_microtask.dart:41) #2 _startMicrotaskLoop (dart:async/schedule_microtask.dart:50) #3 _Timer._runTimers (dart:isolate-patch/timer_impl.dart:394) #4 _Timer._handleMessage (dart:isolate-patch/timer_impl.dart:414) #5 _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:148)
Группировка тестовых случаев
Вы можете сгруппировать тестовые случаи, чтобы они добавили больше смысла вашему тестовому коду. Если у вас много тестовых случаев, это поможет написать намного более чистый код.
В данном коде мы пишем контрольный пример для функции split () и функции trim . Следовательно, мы логически группируем эти тестовые случаи и называем это String .
пример
import "package:test/test.dart"; void main() { group("String", () { test("test on split() method of string class", () { var string = "foo,bar,baz"; expect(string.split(","), equals(["foo", "bar", "baz"])); }); test("test on trim() method of string class", () { var string = " foo "; expect(string.trim(), equals("foo")); }); }); }
Выходные данные — к выходным данным будет добавлено имя группы для каждого контрольного примера, как показано ниже —
00:00 +0: String test on split() method of string class 00:00 +1: String test on trim() method of string class 00:00 +2: All tests passed
Дартс программирование — HTML DOM
Каждая веб-страница находится в окне браузера, которое можно рассматривать как объект.
Объект Document представляет HTML-документ, отображаемый в этом окне. Объект Document имеет различные свойства, которые ссылаются на другие объекты, которые обеспечивают доступ к содержимому документа и его изменение.
Способ доступа к содержимому документа и его изменения называется объектной моделью документа или DOM . Объекты организованы в иерархию. Эта иерархическая структура применяется к организации объектов в веб-документе.
-
Окно — Верхняя часть иерархии. Это крайний элемент иерархии объектов.
-
Документ — каждый HTML-документ, который загружается в окно, становится объектом документа. Документ содержит содержимое страницы.
-
Элементы — представляют контент на веб-странице. Примеры включают в себя текстовые поля, заголовок страницы и т. Д.
-
Узлы — это часто элементы, но они также могут быть атрибутами, текстом, комментариями и другими типами DOM.
Окно — Верхняя часть иерархии. Это крайний элемент иерархии объектов.
Документ — каждый HTML-документ, который загружается в окно, становится объектом документа. Документ содержит содержимое страницы.
Элементы — представляют контент на веб-странице. Примеры включают в себя текстовые поля, заголовок страницы и т. Д.
Узлы — это часто элементы, но они также могут быть атрибутами, текстом, комментариями и другими типами DOM.
Вот простая иерархия нескольких важных объектов DOM —
Dart предоставляет библиотеку dart: html для управления объектами и элементами в DOM. Консольные приложения не могут использовать библиотеку dart: html . Чтобы использовать библиотеку HTML в веб-приложениях, импортируйте dart: html —
import 'dart:html';
Двигаясь дальше, мы обсудим некоторые операции DOM в следующем разделе.
Поиск элементов DOM
Библиотека dart: html предоставляет функцию querySelector для поиска элементов в DOM.
Element querySelector(String selectors);
Функция querySelector () возвращает первый элемент, который соответствует указанной группе селекторов. «селекторы должны быть строковыми с использованием синтаксиса селектора CSS, как указано ниже
var element1 = document.querySelector('.className'); var element2 = document.querySelector('#id');
Пример: манипулирование DOM
Выполните шаги, приведенные ниже, в IDE Webstorm —
Шаг 1 — Файл NewProject → В расположении укажите имя проекта как DemoWebApp .
Шаг 1 — В разделе «Создание примера содержимого» выберите SimpleWebApplication .
Будет создан пример проекта DemoWebApp . Существует файл pubspec.yaml, содержащий зависимости, которые необходимо загрузить.
name: 'DemoWebApp' version: 0.0.1 description: An absolute bare-bones web app. #author: Your Name <[email protected]> #homepage: https://www.example.com environment: sdk: '>=1.0.0 <2.0.0' dependencies: browser: '>=0.10.0 <0.11.0' dart_to_js_script_rewriter: '^1.0.1' transformers: - dart_to_js_script_rewriter
Если вы подключены к Интернету, они будут загружены автоматически, в противном случае вы можете щелкнуть правой кнопкой мыши на pubspec.yaml и получить зависимости.
В веб-папке вы найдете три файла: Index.html, main.dart и style.css
Index.html
<!DOCTYPE html> <html> <head> <meta charset = "utf-8"> <meta http-equiv = "X-UA-Compatible" content = "IE = edge"> <meta name = "viewport" content = "width = device-width, initial-scale = 1.0"> <meta name = "scaffolded-by" content = "https://github.com/google/stagehand"> <title>DemoWebApp</title> <link rel = "stylesheet" href = "styles.css"> <script defer src = "main.dart" type = "application/dart"></script> <script defer src = "packages/browser/dart.js"></script> </head> <body> <h1> <div id = "output"></div> </h1> </body> </html>
Main.dart
import 'dart:html'; void main() { querySelector('#output').text = 'Your Dart web dom app is running!!!.'; }
Запустите файл index.html ; вы увидите следующий вывод на вашем экране.
Обработка событий
Библиотека dart: html предоставляет событие onClick для элементов DOM. Синтаксис показывает, как элемент может обрабатывать поток событий щелчка.
querySelector('#Id').onClick.listen(eventHanlderFunction);
Функция querySelector () возвращает элемент из заданного DOM, а onClick.listen () примет метод eventHandler, который будет вызываться при возникновении события click. Синтаксис eventHandler приведен ниже —
void eventHanlderFunction (MouseEvent event){ }
Давайте теперь возьмем пример, чтобы понять концепцию обработки событий в Dart.