在Chapel中将类类型用作字段

时间:2018-05-03 16:12:34

标签: chapel

我有以下的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类型保留为字段变量。什么是正确的语法,以便宝贝可以得到她的约会并远离角落?

1 个答案:

答案 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!");
      }
    }
  }
}