1. Ініціалізація за замовчуванням
Оголошення з ініціалізатором в Mash Script дозволяє оголосити змінну і одразу ініціалізувати її значенням. Наприклад, оголошення number i {}
створить змінну i
типу number
, і проініціалізує її значенням за замовчуванням для цього типу, яке для числових типів буде 0
:
// Звичайне оголошення
int a;
Out.println(a); // UnboundError
// Оголошення з ініціалізатором
int b { };
Out.println(b); // Вихід: 0
Аналогічно, оголошення string name { };
призведе до присвоєння змінній name
пустого рядка ‘‘
, що є стандартним для рядкових типів.
2. Ініціалізація з параметрами
Ініціалізація з параметрами дозволяє вказати аргументи, які передаються конструктору типу. Наприклад, ви можете вказати значення для змінної типу array
в фігурних дужках, як у прикладі { 'Саша' }
:
array chars { 'Саша' }; // ["С", ...]
Що еквівалентно ініціалізації за допомогою конструктора array('Саша')
:
array chars = array('Саша');
Ініціалізація з параметрами дозволяє вказати не лише один аргумент, але й декілька, в тому числі ключові аргументи. Наприклад:
// Декілька аргументів
Point pt { 10, 20 };
// Ключові аргументи
Person person { name='John', age=30 };
// Змішані аргументи
Lable greeting { 'Hello, world!', root=window };
У першому прикладі, ініціалізація Point p { 10, 20 }
передає два аргументи конструктору типу Point
. У другому прикладі, Person person { name='John', age=30 }
, використовуються ключові аргументи для явного вказання, який аргумент призначений для якого параметру конструктора.
3. Як це реалізовано?
Цей механізм реалізований через автоматичний виклик конструктора об'єкта. Наприклад, оголошення string name { };
по суті еквівалентне string name = string();
, де string()
- виклик конструктора, який створює новий об'єкт типу string
. Такий самий підхід застосовується і для інших типів:
int i {}; // 0
string name {}; // ''
boolean is_prime {}; // false
array arr {}; // []
dict arr {}; // {}
Після виклику MyClass() спочатку викликається метод MyClass.__new__(), який створює та повертає новий екземпляр (об'єкт) цього класу. Після цього автоматично викликається метод __init__ цього екземпляру, який встановлює початкові значення об'єкта.
4. Приклад
У класі Pony
використовується метод __init__
, щоб ініціалізувати об'єкт з параметрами name
і необов'язковим параметром age
, який має значення за замовчуванням 0
. Метод repr
виводить інформацію про об'єкт. У функції main
створюються два об'єкти Pony
з різними параметрами і викликається метод repr
для кожного з них, щоб вивести їхню інформацію.
import { * } from stdl;
class Pony {
void __init__(name: string, age: int=0) {
this._name = name;
this._age = age;
}
void repr() {
Out.println('Name: {this._name}, Age: {this._age}')
}
}
void main() {
Pony pony_1 { "Sunny Hooves" };
// Name: Sunny Hooves, Age: 0
pony_1.repr();
Pony pony_2 { "Sparkle", 7 };
// Name: Sparkle, Age: 7
pony_2.repr();
}
Додатковий приклад демонструє створення об'єкта pony_3
класу Pony
з параметрами "Whisper"
та 3
, звичним способом:
Pony pony_3 = Pony("Whisper", 3);
// Name: Whisper, Age: 3
pony_3.repr();
У Mash Script оголошення з ініціалізацією гарантує, що змінна Pony
буде саме класом (типом даних), а не функцією чи об'єктом.
Читати далі
Константи.
Автоматична ініціалізація параметрів функції.
Оператори +=, -= та інші.
Область бачення змінних.