Часовня: понимание времени жизни управляемых классов с помощью zip и пользовательских итераторов
Я пытаюсь понять жизнь 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
пример?
1 ответ
Я уверен, что это ошибка. Я посмотрю.
В каких случаях аргумент автоматически приводится в заимствованный экземпляр?
Прямо сейчас, когда:
- при вызове метода на нем (
this
аргумент будет заимствовать) - при переходе к аргументу типа
C
или жеborrowed C
(что означает то же самое). - при переходе к полностью универсальному аргументу функции.
Я не уверен, будем ли мы соблюдать правило 3 или нет. Но это не проблема в вашем случае - скорее проблема в том, что некоторый код, представленный компилятором, реализующий оператор forall, убирающий owned
значение. Это ошибка.