Vala是按引用传递还是按值传递?

4

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

我正在尝试开始使用vala,但是了解一下vala是“按引用传递”还是“按值传递”会很有帮助。

2个回答

5
首先,你需要明白默认的 Vala 编译器 valac 会将代码编译成 C 语言(作为中间语言),然后再使用 C 编译器(通常使用 gcc)编译代码。

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

所以,你可以自己检查生成的 C 代码。

现在到了真正的问题:

Vala 支持 按值调用按引用调用。它甚至更加精细。

我们来看一个使用普通 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 *

2

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接