Я пытаюсь понять время жизни класса owned
, когда оно используется в определяемом пользователем итераторе.Рассмотрим следующий код:
var a = new owned C();
var b = new owned C();
a.i = 2;
forall (a1,b1) in zip(a,b) {
b1 = a1;
}
forall (a1,b1) in zip(a,b) {
writeln(a1, " ",b1);
}
class C {
var i : int;
iter these() {
yield 1;
}
iter these(param tag : iterKind) where tag==iterKind.leader {
yield 1;
}
iter these(param tag : iterKind, followThis) ref
where tag==iterKind.follower {
yield i;
}
}
Компиляция и запуск этого кода приводит к следующей ошибке
(08:54)$ chpl test.chpl --warn-unstable
(08:54)$ ./test
test.chpl:25: error: attempt to dereference nil
(08:54)$ chpl --version
chpl version 1.19.0 pre-release (2c10dbe)
Мне не ясно, когда класс * deinit
здесь,Если я заменим owned
на shared
, этот пример будет работать как положено.Что еще интереснее, изменение первого цикла на
forall (a1,b1) in zip(a.borrow(),b.borrow()) {
также позволяет коду работать.В каких случаях аргумент автоматически приводится в экземпляр borrowed
?