Я попробовал вашу программу с предварительной версией 1.19 (которая скоро выйдет), и она распечатала
monkeys.chpl:20: In initializer:
monkeys.chpl:21: error: Field name would outlive the value it is set to
Теперь я объясню проблему:
class Name { ... }
class Monkey {
var name : Name;
proc init(name : string) {
this.name = new owned Name(name);
}
}
эквивалентно
class Name { ... }
class Monkey {
var name : borrowed Name;
proc init(name : string) {
this.name = new owned Name(name);
}
}
что совпадает с
class Name { ... }
class Monkey {
var name : borrowed Name;
proc init(name : string) {
var tmp = new owned Name(name);
this.name = tmp.borrow();
// the instance in tmp is automatically deleted here
}
}
И, возможно, вы можете более четко увидеть, что результат new owned
уничтожается в конце инициализатора.
Исправление простое: объявите поле как var name: owned Name;
:
class Name { ... }
class Monkey {
var name : owned Name;
proc init(name : string) {
this.name = new owned Name(name);
}
}