1. Ініціалізація за замовчуванням
Оголошення з ініціалізатором в Mash Script дозволяє оголосити змінну і одразу ініціалізувати її значенням. Наприклад, оголошення number i {}
створить змінну i
типу number
, і проініціалізує її значенням за замовчуванням для цього типу, яке для числових типів буде 0
:
// Звичайне оголошення
number a;
Out.println(a); // Вихід: null
// Оголошення з ініціалізатором
number b { };
Out.println(b); // Вихід: 0
Аналогічно, оголошення string name { };
призведе до присвоєння змінній name
пустого рядка ‘‘
, що є стандартним для рядкових типів.
2. Ініціалізація з параметрами
Ініціалізація з параметрами дозволяє вказати аргументи, які передаються конструктору типу. Наприклад, ви можете вказати значення для змінної типу string
в фігурних дужках, як у прикладі { 'Саша' }
:
string name { 'Саша' };
Що еквівалентно ініціалізації за допомогою конструктора string('Саша')
:
string name = string('Саша');
Ініціалізація з параметрами дозволяє вказати не лише один аргумент, але й декілька, в тому числі ключові аргументи. Наприклад:
// Декілька аргументів
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
(у цьому випадку, порожній рядок, екземпляр класу string
). Такий самий підхід застосовується і для інших типів:
int i {}; // 0
string name {}; // ''
boolean is_prime {}; // false
Після виклику MyClass() спочатку викликається метод __new__ класу MyClass, який створює та повертає новий екземпляр (об'єкт) цього класу. Після цього автоматично викликається метод __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
буде саме класом (типом даних), а не функцією чи об'єктом.
Читати далі
Константи.
Автоматична ініціалізація параметрів функції.
Оператори +=, -= та інші.
Область бачення змінних.