vala是"通过引用传递"还是"通过值传递"?

Jea*_*dey 4 parameter-passing vala

或者存在像C这样的指针和引用?

我正在尝试使用vala,但很高兴知道vala是"通过引用传递"还是"按值传递"

Jen*_*off 5

首先,您应该了解默认的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) {
    // ...
}
Run Code Online (Sandbox Code Playgroud)

该值将被复制到函数中,无论你在value里面做my_func什么都不会影响调用者.

使用ref以下方式调用引用:

public void my_func (ref int value) {
    // ...
}
Run Code Online (Sandbox Code Playgroud)

地址将被复制到该功能中.你在value里面做的一切my_func也会在来电者身上反映出来.

使用out以下方式调用引用:

public void my_func (out int value) {
    // ...
}
Run Code Online (Sandbox Code Playgroud)

基本上相同ref,但在调用之前不必初始化值my_func.

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

由于这些总是使用指针ref(隐含地)进行管理,因此"out"修饰符现在反映了(隐式)指针的传递方式.

它可以说增加了一个间接层次.

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

虽然气馁,但Vala也确实支持指针,所以你可以在C中拥有int *MyClass *只是喜欢.