Часовня: понимание времени жизни управляемых классов с помощью 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 ответ

Решение

Я уверен, что это ошибка. Я посмотрю.

В каких случаях аргумент автоматически приводится в заимствованный экземпляр?

Прямо сейчас, когда:

  1. при вызове метода на нем (this аргумент будет заимствовать)
  2. при переходе к аргументу типа C или же borrowed C (что означает то же самое).
  3. при переходе к полностью универсальному аргументу функции.

Я не уверен, будем ли мы соблюдать правило 3 или нет. Но это не проблема в вашем случае - скорее проблема в том, что некоторый код, представленный компилятором, реализующий оператор forall, убирающий owned значение. Это ошибка.

Другие вопросы по тегам