gpt4 book ai didi

chapel - 适当的教堂所有权领域

转载 作者:行者123 更新时间:2023-12-01 11:14:13 25 4
gpt4 key购买 nike

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

运行此代码... ( Try it online! )

class Name {

var text : string;

//initializer
proc init(name : string) {
this.text = name;
}

proc writeThis(writer) {
writer.writeln(this.text);
}
} //end of Name

class Monkey {

var name : Name;
var age : int;

proc init(name : string, age : int) {
this.name = new owned Name(name);
this.age = age;
}

proc writeThis(writer) {
writer.writeln("I'm a monkey named ", this.name, ", and I'm ", this.age, " years old.");
}

} //end of class Monkey



var m = new owned Monkey("bananaface", 5);
writeln("m: ", m);

... 使其仅打印:

m: I'm a monkey named 

Try it online!

在 Monkey 的初始化中,有什么比设置 this.name = new owned 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
}
}

你也许可以更清楚地看到 new owned 的结果在初始化程序结束时被销毁了。

修复很简单:将字段声明为 var name: owned Name;:

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

关于chapel - 适当的教堂所有权领域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55070846/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com