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 }, використовуються ключові аргументи для явного вказання, який аргумент призначений для якого параметру конструктора.

Автор: Chris Ried. Опубліковано на Unsplash

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 буде саме класом (типом даних), а не функцією чи об'єктом.

Автор: James Harrison. Опубліковано на Unsplash

Читати далі

  1. Змінні (оголошення, ініціалізація, присвоєння).

  2. Константи.

  3. Автоматична ініціалізація параметрів функції.

  4. Оператори +=, -= та інші.

  5. Область бачення змінних.

Поділись своїми ідеями в новій публікації.
Ми чекаємо саме на твій довгочит!
Romashka
Romashka@Romashka

Створюю інтерпретатор Mash Src

99Прочитань
1Автори
1Читачі
На Друкарні з 16 березня

Більше від автора

  • Mash Script: Базовий синтаксис

    Опис базової структури програми написаної мовою Mash Script

    Теми цього довгочиту:

    Programming
  • λanguage: Написання парсера

    Написання парсера - це досить складне завдання. У сутності, він повинен перетворити фрагмент коду у "абстрактне синтаксичне дерево". Це структуроване представлення програми в пам'яті, воно абстрактне в тому сенсі, що не має значення, з яких саме символів складається вихідний код.

    Теми цього довгочиту:

    Парсер

Вам також сподобається

Коментарі (0)

Підтримайте автора першим.
Напишіть коментар!

Вам також сподобається