【发布时间】: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 教程中的示例显示了这一点。