Часовня: понимание времени жизни управляемых классов с помощью zip и пользовательских итераторов - PullRequest
0 голосов
/ 11 декабря 2018

Я пытаюсь понять время жизни класса 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 Ответ

0 голосов
/ 11 декабря 2018

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...