415 lines
9.4 KiB
Dart
415 lines
9.4 KiB
Dart
// Импорт стороннего компонента
|
||
|
||
|
||
// Функция
|
||
void variablesAndDatatypes() {
|
||
// Переменные и типы данных
|
||
// Логическая переменная: истина (true) или ложь (false)
|
||
bool b = true;
|
||
// Целочисленная переменная
|
||
int i = 10;
|
||
// Вещественная переменная
|
||
double d = 10.001;
|
||
// Текстовая переменная
|
||
String s = 'Hello!';
|
||
|
||
// Коллекции
|
||
// Список (динамический)
|
||
List<int> numbers = [1, 1, 2, 2, 3, 3];
|
||
numbers.add(4);
|
||
print(numbers);
|
||
Set<String> names = {'Ivan', 'Ivan', 'John', 'John', 'Nick', 'Nick'};
|
||
names.add('Helen');
|
||
print(names);
|
||
Map<int, String> dict = {1: 'one', 2: 'two'};
|
||
print(dict);
|
||
dict[0] = 'zero';
|
||
dict[1] = 'one!';
|
||
print(dict);
|
||
}
|
||
|
||
void record() {
|
||
const myRecord = ('text', a: 'one', b: true, c: 3);
|
||
print(myRecord);
|
||
}
|
||
|
||
void variables() {
|
||
// Определение типа переменной при объявлении
|
||
int i = 1;
|
||
// Автоматическое определение типа переменной при объявлении
|
||
var v = 1;
|
||
// Автоматическое определение типа переменной при объявлении
|
||
// с возможностью изменить тип переменной
|
||
dynamic d = 1;
|
||
print(d);
|
||
d = 'test';
|
||
print(d);
|
||
// Все типы данных в Dart являются наследниками класса Object
|
||
Object o = 1;
|
||
}
|
||
|
||
// Функция, которая возвращает значение
|
||
int getValue() {
|
||
return 10;
|
||
}
|
||
|
||
void constants() {
|
||
const int i = 10;
|
||
const j = 10;
|
||
final int k = getValue();
|
||
final l = getValue();
|
||
final int m = 10;
|
||
}
|
||
|
||
void printSmthN(String s) {
|
||
print(s);
|
||
}
|
||
|
||
void printSmth(String? s) {
|
||
// Если s == null, то выводится правая часть выражения
|
||
// иначе будет выводится левая часть выражения
|
||
print(s ?? 'smth');
|
||
}
|
||
|
||
void printSmthUpper(String? s) {
|
||
// Если s == null, то выводится правая часть выражения
|
||
// иначе будет вызвана функция объекта s,
|
||
// а затем будет выводится левая часть выражения
|
||
print(s?.toUpperCase() ?? "SMTH");
|
||
}
|
||
|
||
void printWithError(String? s) {
|
||
print(s!.toUpperCase());
|
||
}
|
||
|
||
void nullables() {
|
||
int a = 10;
|
||
print(a);
|
||
int? b;
|
||
print(b);
|
||
//int c;
|
||
//print(c);
|
||
|
||
String hello = 'Hello!';
|
||
String? nullStr;
|
||
printSmthN(hello);
|
||
// printSmthN(nullStr);
|
||
printSmth(hello);
|
||
printSmth(nullStr);
|
||
printSmthUpper(hello);
|
||
printSmthUpper(nullStr);
|
||
printWithError(hello);
|
||
//printWithError(nullStr);
|
||
}
|
||
|
||
void formattedStrings() {
|
||
const a = 1;
|
||
const b = 2;
|
||
print('a + b');
|
||
// Пример интерполяции
|
||
print('$a + $b');
|
||
// Пример интерполяции
|
||
print('${a + b}');
|
||
|
||
// Пример интерполяции
|
||
const sum = '${a + b}';
|
||
// Пример соединения строк (конкатенация)
|
||
print('sum is ' + sum);
|
||
// Пример интерполяции
|
||
print('sum is $sum');
|
||
}
|
||
|
||
enum GenderType { man, woman, unknown }
|
||
|
||
extension GenderTypeExt on GenderType {
|
||
void printGender() {
|
||
switch (this) {
|
||
case GenderType.man:
|
||
print('This is a man');
|
||
case GenderType.woman:
|
||
print('This is a woman');
|
||
default:
|
||
print('Unknown gender');
|
||
}
|
||
}
|
||
}
|
||
|
||
void enums() {
|
||
const gender = GenderType.man;
|
||
|
||
print('''
|
||
- This is a woman?
|
||
- ${gender == GenderType.woman}
|
||
''');
|
||
}
|
||
|
||
void conditions() {
|
||
const value = 10;
|
||
|
||
if (value > 100) {
|
||
print('big value');
|
||
} else if (value > 50) {
|
||
print('middle value');
|
||
} else {
|
||
print('small value');
|
||
}
|
||
|
||
// Тернарный оператор
|
||
print(value > 100
|
||
? 'big value'
|
||
: value > 50
|
||
? 'middle value'
|
||
: 'small value');
|
||
|
||
switch (value) {
|
||
case > 100:
|
||
print('big value');
|
||
case > 50:
|
||
print('middle value');
|
||
default:
|
||
print('small value');
|
||
}
|
||
|
||
final valueType = switch (value) {
|
||
> 100 => 'big value',
|
||
> 50 => 'middle value',
|
||
_ => 'small value',
|
||
};
|
||
print(valueType);
|
||
|
||
const gender = GenderType.man;
|
||
switch (gender) {
|
||
case GenderType.man:
|
||
print('This is a man');
|
||
case GenderType.woman:
|
||
print('This is a woman');
|
||
default:
|
||
print('Unknown gender');
|
||
}
|
||
|
||
gender.printGender();
|
||
}
|
||
|
||
// Пример функции
|
||
bool isAMan(GenderType gender) {
|
||
return GenderType.man == gender;
|
||
}
|
||
|
||
// Пример функции в функциональном стиле
|
||
bool isAWoman(GenderType gender) => GenderType.woman == gender;
|
||
|
||
// Пример функции с именованными и неименованными параметрами
|
||
void myPrint(
|
||
String s, {
|
||
bool capitalize = false,
|
||
String? suffix,
|
||
}) {
|
||
print('${capitalize ? s.toUpperCase() : s}${suffix ?? ''}');
|
||
}
|
||
|
||
// Данная функция будет работать с любым списком
|
||
void printList<T>(List<T> list) {
|
||
if (list is List<int> || list is List<String>) {
|
||
print(list);
|
||
} else {
|
||
print('Unknown type ${list.runtimeType}');
|
||
}
|
||
}
|
||
|
||
// Примеры работы с циклами
|
||
void loops() {
|
||
final list = [1, 2, 3, 4];
|
||
|
||
for (int i = 0; i < list.length; i++) {
|
||
print(list[i]);
|
||
}
|
||
|
||
for (final element in list) {
|
||
print(element);
|
||
}
|
||
|
||
int i = 0;
|
||
while (i < list.length) {
|
||
print(list[i]);
|
||
i++;
|
||
}
|
||
|
||
for (final element in list) {
|
||
if (element % 2 == 0) {
|
||
continue;
|
||
}
|
||
print(element);
|
||
}
|
||
|
||
for (final element in list) {
|
||
if (element % 2 != 0) {
|
||
continue;
|
||
}
|
||
print(element);
|
||
}
|
||
|
||
for (final element in list) {
|
||
if (element == 3) {
|
||
break;
|
||
}
|
||
print(element);
|
||
}
|
||
}
|
||
|
||
// Объявление класса
|
||
class Car {
|
||
// Поля
|
||
final int maxSpeed;
|
||
final String? manufacturer;
|
||
|
||
double priceInDollars = 0;
|
||
|
||
// Конструктор
|
||
Car(this.maxSpeed, {this.manufacturer});
|
||
|
||
// Методы
|
||
bool canReachSpeed(int speed) => speed <= maxSpeed;
|
||
|
||
String getInfo() =>
|
||
'car: ${manufacturer ?? 'unknown'}; max speed: $maxSpeed, price \$: ${priceInDollars.toStringAsFixed(2)}';
|
||
|
||
String get info =>
|
||
'car: ${manufacturer ?? 'unknown'}; max speed: $maxSpeed, price \$: ${priceInDollars.toStringAsFixed(2)}';
|
||
|
||
set price(double priceInRubles) => priceInDollars = priceInRubles / 100;
|
||
}
|
||
|
||
// Пример работы с объектами класса Car
|
||
void cars() {
|
||
final unknown = Car(100);
|
||
final lada = Car(110, manufacturer: 'VAZ');
|
||
lada.price = 26000.00;
|
||
final bmw = Car(120, manufacturer: 'BMW');
|
||
bmw.price = 104000.23;
|
||
|
||
print(unknown.getInfo());
|
||
print(unknown.info);
|
||
print(lada.getInfo());
|
||
print(lada.info);
|
||
print(bmw.getInfo());
|
||
print(bmw.info);
|
||
print(lada.canReachSpeed(120));
|
||
print(bmw.canReachSpeed(120));
|
||
}
|
||
|
||
class MyTest {
|
||
final int publicField;
|
||
final int _privateField = 10;
|
||
|
||
MyTest(this.publicField);
|
||
}
|
||
|
||
abstract class Vehicle {
|
||
final int maxSpeed;
|
||
|
||
Vehicle(this.maxSpeed);
|
||
|
||
bool canReachSpeed(int speed) => speed <= maxSpeed;
|
||
}
|
||
|
||
class Car2 extends Vehicle {
|
||
final String? manufacturer;
|
||
|
||
double priceInDollars = 0;
|
||
|
||
Car2(super.maxSpeed, {this.manufacturer});
|
||
|
||
// Именованный конструктор
|
||
Car2.lada(super.maxSpeed) : manufacturer = 'VAZ';
|
||
|
||
String get info => 'car2: ${manufacturer ?? 'unknown'}; max speed: $maxSpeed';
|
||
}
|
||
|
||
void cars2() {
|
||
final unknown = Car2(100);
|
||
final lada = Car2.lada(110);
|
||
final bmw = Car2(120, manufacturer: 'BMW');
|
||
|
||
print(unknown.info);
|
||
print(lada.info);
|
||
print(bmw.info);
|
||
print(lada.canReachSpeed(120));
|
||
print(bmw.canReachSpeed(120));
|
||
}
|
||
|
||
void main(List<String> arguments) {
|
||
// Вывод данных в консоль
|
||
print('Hello!');
|
||
|
||
// Вызов функции
|
||
//variablesAndDatatypes();
|
||
|
||
//record();
|
||
|
||
//constants();
|
||
|
||
//variables();
|
||
|
||
//nullables();
|
||
|
||
// Использование Random из стороннего компонента dart:math
|
||
//print(Random().nextDouble());
|
||
|
||
// formattedStrings();
|
||
|
||
// enums();
|
||
|
||
// conditions();
|
||
|
||
// Пример работы с функциями
|
||
/*const gender = GenderType.man;
|
||
print(isAMan(gender));
|
||
print(isAWoman(gender));
|
||
const s = 'Hello';
|
||
myPrint(s);
|
||
myPrint(s, capitalize: true);
|
||
myPrint(s, suffix: '?');
|
||
myPrint(s, capitalize: true, suffix: '!');
|
||
myPrint(s, suffix: '!', capitalize: true);*/
|
||
|
||
// Пример работы с обобщениями (щаблонными типами)
|
||
/*printList([1, 2, 3, 4]);
|
||
printList([1.0, 2, 3, 4]);
|
||
printList(['1', '2', '3', '4']);
|
||
printList([1, '2', '3', '4']);*/
|
||
|
||
// Пример анонимных функций
|
||
/*[1, 2, 3, 4].forEach((int val) => print(val));
|
||
[1, 2, 3, 4].forEach(print);
|
||
print([1, 2, 3, 4].reduce((int a, int b) {
|
||
return a + b;
|
||
}));*/
|
||
|
||
// Примеры работы с циклами
|
||
// loops();
|
||
|
||
// cars();
|
||
|
||
/*final myTest = MyTest(2);
|
||
print(myTest.publicField);
|
||
print(myTest._privateField);
|
||
|
||
final myTest2 = MyTest2(2);
|
||
print(myTest2.publicField);
|
||
// print(myTest2._privateField);*/
|
||
|
||
// Пример работы со статическими полями класса
|
||
/*final st1 = MyStatic();
|
||
final st2 = MyStatic();
|
||
print(st1.static);
|
||
print(st2.static);
|
||
MyStatic.staticField++;
|
||
print(st1.static);
|
||
print(st2.static);
|
||
print(MyStatic.staticField);*/
|
||
|
||
// final v = Vehicle(10);
|
||
|
||
// cars2();
|
||
}
|