作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在 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
在 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/
如果Chapel程序不使用语言环境(*),那么只有一个语言环境,则该程序将使用执行机器上的所有处理器/内核(如果大概使用内核线程)。 (*)考虑到在大多数操作系统中使用语言环境一词来表示语言和变体,在
我试图了解 owned 的生命周期类,在用户定义的迭代器中使用时。考虑以下代码: var a = new owned C(); var b = new owned C(); a.i = 2; fora
我是一名优秀的程序员,十分优秀!