Vala 编程语言高级特性-具有语法支持的方法
具有语法支持的方法
Vala 能够识别某些具有特定名称和签名的方法,并为它们提供语法支持。例如,如果一个类型拥有 contains()
方法,那么该类型的对象就可以与 in
操作符一起使用。下表列出了这些特殊方法。其中 T
和 Tn
在此表中仅是类型占位符,意在替换为实际类型。
索引器
T2 get(T1 index)
索引访问:obj[index]
void set(T1 index, T2 item)
索引赋值:obj[index] = item
具有多个索引的索引器
T3 get(T1 index1, T2 index2)
索引访问:obj[index1, index2]
void set(T1 index1, T2 index2, T3 item)
索引赋值:obj[index1, index2] = item
其他方法
T slice(long start, long end)
切片:obj[start:end]
bool contains(T needle)
in
操作符:bool b = needle in obj
string to_string()
在字符串模板中的支持:@"$obj"
Iterator iterator()
可通过 foreach
进行迭代
T2 get(T1 index)
T1 size { get; }
可通过 foreach
进行迭代
Iterator
类型可以是任何名称,并且必须实现以下两种协议之一:
bool next()
T get()
标准迭代器协议:持续迭代直到 .next()
返回 false
。当前元素通过 .get()
获取。
T? next_value()
替代迭代器协议:如果迭代器对象拥有一个返回可空类型的 .next_value()
函数,那么我们通过调用此函数进行迭代,直到它返回 null
。
以下示例实现了其中的一些方法:
public class EvenNumbers {public int get(int index) {return index * 2;}public bool contains(int i) {return i % 2 == 0;}public string to_string() {return "[This object enumerates even numbers]";}public Iterator iterator() {return new Iterator(this);}public class Iterator {private int index;private EvenNumbers even;public Iterator(EvenNumbers even) {this.even = even;}public bool next() {return true;}public int get() {this.index++;return this.even[this.index - 1];}}
}void main() {var even = new EvenNumbers();stdout.printf("%d\n", even[5]); // get()if (4 in even) { // contains()stdout.printf(@"$even\n"); // to_string()}foreach (int i in even) { // iterator()stdout.printf("%d\n", i);if (i == 20) break;}
}