我有以下的Chapel代码,但效率似乎不高。
class Student {
var name: string;
proc init(name:string) {this.name = name;}
}
class GoodStudent : Student {
var likesToDate: BadStudent;
proc init(name:string) {super.init(name=name);}
}
class BadStudent : Student {
proc init(name:string) {super.init(name=name);}
}
var students: [1..0] Student;
students.push_back(new GoodStudent("baby"));
students.push_back(new GoodStudent("some other girl"));
students.push_back(new BadStudent("patrick swayze"));
for s in students {
for t in students {
if t:GoodStudent != nil {
var tt = t:GoodStudent;
writeln(tt.name, " :will date?: ", s.name);
if s:tt.likesToDate.type != nil {
writeln(" ... YES!");
} else {
writeln(" ... NO!");
}
}
}
}
我使用空GoodStudent
来比较潜在日期的类型。我宁愿将GoodStudent
类型保留为字段变量。什么是正确的语法,以便宝贝可以得到她的约会并远离角落?
答案 0 :(得分:2)
与任何其他变量一样,可以使用type
关键字代替var
声明类字段,以指定它们代表类型而不是值。具有type
字段的类是通用的 - 类初始化程序可以在实例化类时将字段设置为任何类型。这个primer example演示了如何在泛型类中使用类型字段。
由于GoodStudent
仅对她likesToDate
的学生类型感兴趣,而不是任何特定实例,因此该字段可以替换为类型字段。在程序执行期间,类型字段不会占用任何内存,例如使用var
声明的版本。
class GoodStudent : Student {
type likesToDate = BadStudent;
proc init(name:string) {super.init(name=name);}
}
然后,您可以稍微修改主循环以访问类型字段,而不是通过字段.type
。
for s in students {
for t in students {
var tt = t:GoodStudent;
if tt != nil {
writeln(tt.name, " :will date?: ", s.name);
if s:tt.likesToDate != nil {
writeln(" ... YES!");
} else {
writeln(" ... NO!");
}
}
}
}