Или существуют указатели и ссылки, такие как C?Является ли vala «переходом по ссылке» или «переходом по значению»?
Я пытаюсь начать работу с Валами но хорошо знать, если Вал «проходит по ссылке» или «проходит по значению»
Или существуют указатели и ссылки, такие как C?Является ли vala «переходом по ссылке» или «переходом по значению»?
Я пытаюсь начать работу с Валами но хорошо знать, если Вал «проходит по ссылке» или «проходит по значению»
Прежде всего, вы должны понимать, что компилятор vala по умолчанию valac
компилируется в C (в качестве исходного кода). Затем код компилируется с использованием компилятора C (обычно gcc
).
valac -C example.vala
будет компилировать example.c
Таким образом, вы можете проверить Производимый код С себя.
Теперь реальный вопрос:
Vala поддерживает call-by-value
и call-by-reference
. Это даже немного более мелкозернистый, чем этот.
Возьмем пример, используя простой тип данных C (int).
вызова по значению:
public void my_func (int value) {
// ...
}
значение будет скопировано в функцию, независимо от того, что вы делаете с value
внутри my_func
это не повлияет на абонента.
Вызов по ссылке с помощью ref
:
public void my_func (ref int value) {
// ...
}
адрес будет скопирован в функцию. Все, что вы делаете с value
внутри my_func
, также будет отражено на стороне вызывающего абонента.
Вызов по ссылке с помощью out
:
public void my_func (out int value) {
// ...
}
В основном так же, как ref
, но стоимость не должна быть инициализирована перед вызовом my_func
.
Для типов данных, основанных на GObject
(нестатических классах), он усложняется, поскольку вам необходимо учитывать управление памятью.
Поскольку они всегда управляются с помощью указателей (имплицитно), то ref
и модификаторы `out' теперь отражают то, как передается (неявный) указатель.
Он добавляет еще один уровень косвенности, так сказать.
string
и типы данных массива также управляются внутренними средствами с использованием указателей и автоматического подсчета ссылок (ARC).
Хотя обескуражен, Вал также делает указатели поддержки, так что вы можете иметь int *
или MyClass *
так же, как в C.
Технически, она проходит по значению, так как исходный код преобразуется в C. Простые типы (числовые типы, булевы, перечисления, флаги) передаются по значению. Строки передаются по ссылке, но поскольку они неизменяемы, они также могут быть переданы по значению.
Однако массивы, объекты и структуры передаются с помощью указателей в C, поэтому они проходят по ссылке. Существуют также модификаторы ref
и out
для работы с параметрами, которые заставляют эти параметры передаваться по ссылке.