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 中都是使用指针传递的,因此它们是按引用传递的。还有 ref
和 out
函数参数修饰符,强制这些参数通过引用传递。
首先,您应该了解默认的 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) {
// ...
}
该值将被复制到函数中,无论您在 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 *
。
或者存在像C?
这样的指针和引用我正在尝试开始使用 vala,但很高兴知道 vala 是 "pass by reference" 还是 "pass by value"
从技术上讲,它按值传递,因为底层代码已转换为 C。简单类型(数字类型、布尔值、枚举、标志)按值传递。字符串是按引用传递的,但由于它们是不可变的,所以它们也可以按值传递。
然而,数组、对象和结构在 C 中都是使用指针传递的,因此它们是按引用传递的。还有 ref
和 out
函数参数修饰符,强制这些参数通过引用传递。
首先,您应该了解默认的 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) {
// ...
}
该值将被复制到函数中,无论您在 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 *
。