首页 > 解决方案 > 我可以让函数在 Vala 中处理多个数据类型参数吗?

问题描述

在下面的代码片段中,我有两个功能完全相同(read_arrayread_array2),在数组中查找一个项目。唯一的区别是参数 (string[], stringint[] 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;
}

标签: functionargumentsvala

解决方案


你可以使用泛型,但你必须小心一些事情。

首先,您不能将值类型(即int[])的数组传递给泛型函数,请参阅此问题以供参考:

Vala:传递通用数组会破坏值

其次,您需要通过某种相等性测试函数,您必须为每种类型编写一次。

这是一个工作示例:

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");
}

像这样将一个值装箱成一个可以为空的值是非常难看的,但我不知道解决上述编译器问题的更好方法......

如果您愿意使用 libgee,您可以使用 Gee.ArrayList 也可以。


推荐阅读