适当的教堂所有权

Kyl*_*yle 3 chapel

用于init中创建的对象字段的适当所有权是什么?我认为最好使用“所有”,但看起来它在初始化完成后并没有保留那些。

运行此代码...(在线尝试!

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);
Run Code Online (Sandbox Code Playgroud)

...使其仅打印:

m: I'm a monkey named 
Run Code Online (Sandbox Code Playgroud)

在线尝试!

在Monkey的init中,比设置this.name = new own Name(...)更合适的所有权是什么?

mpp*_*ppf 5

我用预发行的1.19版本(即将推出)尝试了您的程序,并打印了

monkeys.chpl:20: In initializer:
monkeys.chpl:21: error: Field name would outlive the value it is set to
Run Code Online (Sandbox Code Playgroud)

现在我将解释问题:

class Name { ... }
class Monkey {
  var name : Name;
  proc init(name : string) {
    this.name = new owned Name(name);
  }
}
Run Code Online (Sandbox Code Playgroud)

相当于

class Name { ... }
class Monkey {
  var name : borrowed Name;
  proc init(name : string) {
    this.name = new owned Name(name);
  }
}
Run Code Online (Sandbox Code Playgroud)

这与

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
  }
}
Run Code Online (Sandbox Code Playgroud)

而且,您也许可以更清楚地看到new owned初始化的末尾销毁了的结果。

解决方法很简单:将字段声明为var name: owned Name;

class Name { ... }
class Monkey {
  var name : owned Name;
  proc init(name : string) {
    this.name = new owned Name(name);
  }
}
Run Code Online (Sandbox Code Playgroud)