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 буде саме класом (типом даних), а не функцією чи об'єктом.
Читати далі
Константи.
Автоматична ініціалізація параметрів функції.
Оператори +=, -= та інші.
Область бачення змінних.