我可以让函数在 Vala 中处理多个数据类型参数吗?
Can I make a function handle multiple data type arguments in Vala?
在下面的代码片段中,我有两个功能完全相同(read_array
和 read_array2
),在数组中查找一个项目。唯一的区别是参数的数据类型(string[], string
和 int[] int
)。创建两个相似的函数似乎很不优雅。
有没有办法在一个函数中以通用方式处理这两个问题?
void main () {
/* get index of string in array */
string[] arr = {"one", "two", "three"};
int index = read_array(arr, "two");
print(@"$index\n");
secundary ();
}
void secundary () {
/* get index of int in array */
int[] arr = {1, 2, 3};
int index = read_array2(arr, 2);
print(@"$index\n");
}
public int read_array (string[] arr, string needle) {
for (int i=0; i < arr.length; i++) {
if(needle == arr[i]) return i;
} return -1;
}
// write a separate function because other data type? ughh...
public int read_array2 (int[] arr, int needle) {
for (int i=0; i < arr.length; i++) {
if(needle == arr[i]) return i;
} return -1;
}
你可以使用泛型,但你必须小心一些事情。
首先你不能将值类型的数组(即int[]
)传递给泛型函数,参考这个问题:
其次,您需要通过某种相等性测试函数,您必须为每种类型编写一次。
这是一个工作示例:
public delegate bool EqualFunc<T> (T l, T r);
bool str_equals (string l, string r) {
return l == r;
}
bool int_equals (int? l, int? r) {
return l == r;
}
public int read_array<T> (T[] arr, T needle, EqualFunc<T> equal_func) {
for (int i = 0; i < arr.length; i++) {
if (equal_func (needle, arr[i])) {
return i;
}
}
return -1;
}
void main () {
// get index of string in array
string[] arr = {"one", "two", "three"};
int index = read_array (arr, "two", str_equals);
print(@"$index\n");
secondary ();
}
void secondary () {
// get index of int in array
int?[] arr = {1, 2, 3};
int index = read_array (arr, 2, int_equals);
print(@"$index\n");
}
像这样将值装箱到可为 null 的值中非常难看,但我不知道解决上述编译器问题的更好方法...
如果您愿意使用 libgee,您可以使用 Gee.ArrayList,它也可以。
在下面的代码片段中,我有两个功能完全相同(read_array
和 read_array2
),在数组中查找一个项目。唯一的区别是参数的数据类型(string[], string
和 int[] int
)。创建两个相似的函数似乎很不优雅。
有没有办法在一个函数中以通用方式处理这两个问题?
void main () {
/* get index of string in array */
string[] arr = {"one", "two", "three"};
int index = read_array(arr, "two");
print(@"$index\n");
secundary ();
}
void secundary () {
/* get index of int in array */
int[] arr = {1, 2, 3};
int index = read_array2(arr, 2);
print(@"$index\n");
}
public int read_array (string[] arr, string needle) {
for (int i=0; i < arr.length; i++) {
if(needle == arr[i]) return i;
} return -1;
}
// write a separate function because other data type? ughh...
public int read_array2 (int[] arr, int needle) {
for (int i=0; i < arr.length; i++) {
if(needle == arr[i]) return i;
} return -1;
}
你可以使用泛型,但你必须小心一些事情。
首先你不能将值类型的数组(即int[]
)传递给泛型函数,参考这个问题:
其次,您需要通过某种相等性测试函数,您必须为每种类型编写一次。
这是一个工作示例:
public delegate bool EqualFunc<T> (T l, T r);
bool str_equals (string l, string r) {
return l == r;
}
bool int_equals (int? l, int? r) {
return l == r;
}
public int read_array<T> (T[] arr, T needle, EqualFunc<T> equal_func) {
for (int i = 0; i < arr.length; i++) {
if (equal_func (needle, arr[i])) {
return i;
}
}
return -1;
}
void main () {
// get index of string in array
string[] arr = {"one", "two", "three"};
int index = read_array (arr, "two", str_equals);
print(@"$index\n");
secondary ();
}
void secondary () {
// get index of int in array
int?[] arr = {1, 2, 3};
int index = read_array (arr, 2, int_equals);
print(@"$index\n");
}
像这样将值装箱到可为 null 的值中非常难看,但我不知道解决上述编译器问题的更好方法...
如果您愿意使用 libgee,您可以使用 Gee.ArrayList,它也可以。