Chapel 字段的适当所有权

Chapel 字段的适当所有权,chapel,Chapel,在init中创建的对象字段的适当所有权是什么?我认为最好使用“owned”,但在init完成后,它似乎不会保留这些内容 正在运行此代码。。。() 。。。使其仅打印: m: I'm a monkey named 在Monkey的init中,还有什么比设置这个更合适的所有权。name=新拥有的名称(…)?我用预发行版1.19版(即将推出)试用了你的程序,并打印了出来 monkeys.chpl:20: In initializer: monkeys.chpl:21: error: Field n

在init中创建的对象字段的适当所有权是什么?我认为最好使用“owned”,但在init完成后,它似乎不会保留这些内容

正在运行此代码。。。()

。。。使其仅打印:

m: I'm a monkey named 


在Monkey的init中,还有什么比设置这个更合适的所有权。name=新拥有的名称(…)?

我用预发行版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
  }
}
在这里,您可能可以更清楚地看到,
newowned
的结果在初始值设定项的末尾被销毁

修复方法很简单:将字段声明为
var name:owned name

class Name { ... }
class Monkey {
  var name : owned Name;
  proc init(name : string) {
    this.name = new owned Name(name);
  }
}

我显然错过了很多我在学习新的语言规范时应该声明所有权的地方。在字段声明和初始化中都拥有它是正确的吗?是的。在迁移代码时,或者如果要迁移大脑,我建议使用
--warn unstable
标记任何未修饰的类类型。(例如,该标志将要求您始终使用
非托管名称
借用名称
共享名称
,或
自有名称
,而不仅仅是
名称
,它过去的意思是
非托管名称
,现在的意思是
借用名称
。我的意思是我错过了教堂中的位置。)文档,其中清楚地解释了所有这些更改背后的语义以及如何进行更改。您知道吗?另一个相关文档链接是
class Name { ... }
class Monkey {
  var name : owned Name;
  proc init(name : string) {
    this.name = new owned Name(name);
  }
}