【问题标题】:Vala - Print generic valueVala - 打印通用值
【发布时间】:2017-05-06 19:36:57
【问题描述】:

我正在尝试创建一个能够打印出它的值的通用类。

class Point<T>
{ 
    public T x {get; set; default = 0;}
    public T y {get; set; default = 0;}

    public void print()
    {
        stdout.puts(@"x: $x, y: $y\n");
    }
}

int main(string[] args)
{
    var point = new Point<int>();
    point.x = 12;
    point.y = 33;
    point.print();

    return 0;
}

编译器给了我这些错误:

main.vala:8.21-8.22: error: The name `to_string' does not exist in the context of `T'
        stdout.puts(@"x: $x, y: $y\n");
                         ^^
main.vala:8.28-8.29: error: The name `to_string' does not exist in the context of `T'
        stdout.puts(@"x: $x, y: $y\n");
                                ^^

有没有办法解决这个问题?

【问题讨论】:

    标签: generics vala


    【解决方案1】:

    不直接。您需要传递一个委托来打印您的项目:

    delegate string Stringify<T>(T item);
    class Point<T>
    { 
        public T x {get; set; default = 0;}
        public T y {get; set; default = 0;}
    
        public void print(Stringify<T> stringifier)
        {
            stdout.puts(@"x: $(stringifier(x)), y: $(stringifier(y))\n");
        }
    }
    int main(string[] args)
    {
        var point = new Point<int>();
        point.x = 12;
        point.y = 33;
        point.print(int.to_string);
        return 0;
    }
    

    或者,您可以像 Gee 那样构建一组特殊情况: https://github.com/GNOME/libgee/blob/master/gee/functions.vala#L49

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-29
      • 1970-01-01
      • 2011-10-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多