vala 是 "pass by reference" 还是 "pass by value"?

Is vala a "pass by reference" or "pass by value"?

或者存在像C?

这样的指针和引用

我正在尝试开始使用 vala,但很高兴知道 vala 是 "pass by reference" 还是 "pass by value"

从技术上讲,它按值传递,因为底层代码已转换为 C。简单类型(数字类型、布尔值、枚举、标志)按值传递。字符串是按引用传递的,但由于它们是不可变的,所以它们也可以按值传递。

然而,数组、对象和结构在 C 中都是使用指针传递的,因此它们是按引用传递的。还有 refout 函数参数修饰符,强制这些参数通过引用传递。

首先,您应该了解默认的 vala 编译器 valac 编译为 C(作为一种迭代语言)。然后使用 C 编译器编译代码(通常 gcc)。

valac -C example.vala 将编译为 example.c

因此您可以自己检查生成的 C 代码。

现在开始真正的问题:

Vala 同时支持 call-by-valuecall-by-reference。它甚至比那更细粒度。

让我们举一个使用普通 C 数据类型 (int) 的例子。

按值调用:

public void my_func (int value) {
    // ...
}

该值将被复制到函数中,无论您在 my_func 中使用 value 做什么,都不会影响调用者。

使用 ref 的引用调用:

public void my_func (ref int value) {
    // ...
}

地址将被复制到函数中。您在 my_func 中使用 value 所做的一切也会反映在调用方。

使用 out 的引用调用:

public void my_func (out int value) {
    // ...
}

ref基本相同,但在调用my_func前不需要初始化值。

对于基于 GObject 的数据类型(非静态 类),它变得更加复杂,因为您必须考虑内存管理。

由于这些总是使用指针(隐式)管理,因此 ref 和“out”修饰符现在反映了(隐式)指针的传递方式。

可以说,它增加了一层间接寻址。

string 和数组数据类型也在内部使用指针和自动引用计数 (ARC) 进行管理。

尽管 感到沮丧,Vala 也支持指针,因此您可以像在 C 中一样使用 int *MyClass *