【问题标题】:vala iterator next_value method return typevala 迭代器 next_value 方法返回类型
【发布时间】:2016-01-10 03:50:16
【问题描述】:

来自 vala 教程:

替代迭代器协议:“T?next_value()” 如果迭代器对象有一个 .next_value() 函数返回一个可为空的类型,那么我们通过调用这个函数进行迭代,直到它返回 null。

我写了一些代码,但是出错了。

错误信息:

错误:`Something.next_value' 的返回类型必须可以为空

foreach(A 中的字符串 s){

                     ^

我不明白,它在我的 next_value 返回类型中已经可以为空了。

如何更正此代码?

public static void main() {
    stdout.printf("hello\n");
    var A = new Something<string> ({"aa", "bb"});

    foreach (string s in A) {
        stdout.puts(s);
        stdout.puts ("\n");
    }
    
}

public class Something<T> : Object {
    public T[]  data;
    private int _size;
    private int _i = 0;

    public Something (owned T[] a){
        this.data  = a;
        this._size = data.length;
    }

    public Something<T> iterator(){
        return this;
    }
    
    // error: return type of `Something.next_value' must be nullable
    // foreach (string s in A) {
    //                        ^

    public T? next_value () {
        return _i < _size ? data[_i++] : null;
    }
}

【问题讨论】:

  • 你在重新发明 Gee.ArrayList 吗? valadoc.org/#!api=gee-0.10/Gee.ArrayList
  • @Jens Mühlenhoff 你有什么想法吗?实际上,如果我实现 next() 和 get()。它会起作用的。但我不想这样做。因为我想保留 get() 方法,例如:var a = A[2]。所以我有这个问题。如果这是一个错误?
  • 这对我来说似乎是一个错误。您可以向bugzilla.gnome.org(产品“vala”)举报。
  • 顺便说一句:Vala 对泛型类型的可空处理可能会很棘手,尤其是在使用值类型时。所以这可能与泛型有关。您可以尝试为string编写一个专门的类,看看错误是否仍然存在。
  • 如果您想将get() 用于索引并使用get() 作为迭代器,则应该没有冲突,因为通常您会将迭代器实现为嵌套类。 Vala 教程中的示例显示了这一点。

标签: iterator vala


【解决方案1】:

您已声明泛型数据类型必须可以为空,这是正确的。因此,当您将特定数据类型作为类型参数传递时,请确保它也可以为空。行:

var A = new Something<string> ({"aa", "bb"});

应该是:

var A = new Something<string?> ({"aa", "bb"});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-19
    • 2019-12-28
    • 1970-01-01
    相关资源
    最近更新 更多