或者存在指针和引用,例如 C ?
我正在尝试使用 vala ,但很高兴知道vala是“通过引用传递”还是“按值传递”
答案 0 :(得分:5)
首先,您应该了解默认的vala编译器valac
编译为C(作为中间语言)。然后使用C编译器(通常为gcc
)编译代码。
valac -C example.vala
将汇编为example.c
因此,您可以自己检查生成的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)进行内部管理。
虽然气馁,但Vala也支持指针,因此您可以像C一样拥有int *
或MyClass *
。
答案 1 :(得分:1)
从技术上讲,它会传递值,因为底层代码转换为C.简单类型(数字类型,布尔值,枚举,标志)按值传递。字符串通过引用传递,但由于它们是不可变的,因此它们也可以通过值传递。
但是,数组,对象和结构都是使用C中的指针传递的,因此它们通过引用传递。函数参数还有ref
和out
修饰符,强制这些参数通过引用传递。