vala
1.0.0
1.0.0
  • Учебник Vala
  • Основы
    • Элементы языка
      • Типы данных
      • Управляющие конструкции
      • Методы
      • Делегаты
      • Лямбды / Замыкания
      • Пространства имён
      • Структуры
      • Классы
    • ООП
      • Основы
      • Конструктор
      • Деструктор
      • Сигналы
      • Свойства(Properties)
      • Наследование
      • Абстрактные классы
      • Интерфейсы / Миксины
      • Полиморфизм
      • Сокрытие методов
      • Информация о типах времени выполнения(Run-Time Type Information)
      • Динамическое приведение типов(Dynamic Type Casting)
      • Универсальные шаблоны(Generics)
      • Создание объектов в стиле GObject
      • Интеграция с D-Bus
      • Профили(Другие бэкенды помимо GLib)
  • Продвинутые возможности
    • Ассерты и контрактное программирование
    • Обработка ошибок
    • Управление параметрами
    • Методы с поддержкой синтаксиса
    • Многопоточность
    • Главный цикл(The Main Loop)
    • Асинхронные методы
    • Слабые ссылки(Weak References)
    • Список аргументов переменной длины
    • Указатели
    • Классы не наследующие Object
    • Коллекции
      • Введение
      • HashSet<G>
      • ArrayList<G>
      • HashMap<K,V>
      • Lock-free структуры
  • Экспериментальные фичи
    • Введение
    • Строгий не null режим(Rust mode)
    • Литералы регулярных выражений(regexp)
    • Цепочки связанных выражений
  • Использование и создание библиотек
    • Введение
    • Инструменты
    • Генерирование VAPI файла из предыдущего с помощью vapigen.
    • Использование библиотек
    • Создание библиотеки
    • Vala and C
    • Meson
      • Config file
      • Static Library
      • Shared Library
      • Target GLib Version
  • Технические приёмы
    • Unit тестирование
    • Отладка
    • Использование GLib
  • Продвинуты гайд(WIP)
  • Habr
  • Примеры кода
  • Functional Programming
    • Gpseq
    • Compose
  • Examples
    • Basic
    • GTK
      • Базовые GTK программы
      • Flappy Bird(WIP)
      • DnD
    • Websocket
  • Apps
    • Games
  • Meson-Book
    • MesonBook
    • Wrap
    • Crosscompile
    • Object files
    • Library
    • Executable
    • Code Generation
    • Installing
    • Unit Tests
    • Meson 0.54
    • Meson 0.53
  • golang-book
    • Ваша первая программа
    • Типы
    • UPDATE.MD
Powered by GitBook
On this page

Was this helpful?

  1. Продвинутые возможности

Управление параметрами

Методы в Vala принимают нуль и больше аргументов. Стандартное поведение при вызове метода следующее:

Все параметры с типами значениями копируются в локальные переменные.

Все параметры со ссылочными типами не копируются, вместо этого методу передается просто ссылки на них.

Это поведение можно изменить с помощью модификаторов ref и out.

out со стороны вызывающего кода

вы можете передать методу не инициализированную переменную и можете ожидать, что она будет инициализирована после завершения работы метода

out со стороны вызываемого кода

параметр является не инициализированным, вам нужно его инициализировать

ref со стороны вызывающего кода

передаваемая методу переменная должна быть инициализирована и значение может быть изменено внутри метода.

ref со стороны вызываемого кода

переданный параметр инициализирован и вы можете при желании изменить его значение

void method_1(int a, out int b, ref int c) { ... }
void method_2(Object o, out Object p, ref Object q) { ... }

Эти методы можно вызывать следующим образом:

int a = 1;
int b;
int c = 3;
method_1(a, out b, ref c);

Object o = new Object();
Object p;
Object q = new Object();
method_2(o, out p, ref q);

Обращение к переменным будет следующим:

  • "а" имеет тип значение. Его значение будет скопировано в другое место в локальной памяти метода, поэтому любые изменения внутри метода не затронут исходное значение после завершения выполнения метода.

  • "b" так же имеет тип значение. Однако передан как out параметр. В данном случае значение не копируется, вместо этого методу передается указатель на переменную, так что любые изменения значения переменной внутри метода будут видны вызывающему коду.

  • "с" будет вести себя точно так же, как и "b" единственное отличие в другом виде записи.

  • "о" имеет ссылочный тип. Методу передается ссылка на исходный объект, поэтому метод может его изменить. Однако если внутри метода переменной присвоить ссылку на другой объект, вызывающему коду новая ссылка видна не будет.

  • "р" имеет такой же тип, но он передается как out параметр. Это значит, что методу передается указатель на ссылку, поэтому он может заменить ссылку другой ссылкой на другой объект, и после завершения метода присвоенная внутри метода новая ссылка сохранится. Когда вы используете аргумент данного типа, если вы не присваиваете новую ссылку параметру, то его значение будет установлено на null.

  • "q" снова того же типа. В данном случае он обрабатывается сходным с "р" образом с одним важным отличием, т.к. метод может либо не изменять ссылку внутри него и может получить доступ к объекту, на который он указывает. Vala будет следить за тем, что "q" действительно хранит ссылку на объект, и не хранит null.

Here is an example of how to implement method_1():

void method_1(int a, out int b, ref int c) {
    b = a + c;
    c = 3;
}

When setting the value to the out argument "b", Vala will ensure that "b" is not null. So you can safely pass null as the second argument of method_1() if you are not interested by this value.

PreviousОбработка ошибокNextМетоды с поддержкой синтаксиса

Last updated 6 years ago

Was this helpful?