memory-management - 如何在 Chapel 中产生一个 nilable 共享对象?

标签 memory-management object-lifetime chapel data-objects

目前,我正在研究 Chapel 数据对象,但遇到了一些问题。我有一个名为 Row 的类,它可以为零。 我有这三种方法:

    override iter these()ref {
      for row in this.fetchall(){
        yield row;
      }
    }

    override proc fetchone(): shared Row? {
      if this.curRow == this.numRows {
        return nil;
      }
      var row = new shared Row();

      var rowNum: int(32) = 0;
      mysql_data_seek(this.res, this.curRow: c_int);
      var _row = mysql_fetch_row(this.res);

      while(rowNum < this.nFields) {
        var datum: string = __get_mysql_row_by_number(_row, rowNum: c_int);
        var colinfo = this.getColumnInfo(rowNum);
        row.addData(colinfo.name,datum);
        rowNum += 1;
      }
      this.curRow += 1;
      return row;
    }

    override iter fetchall(): borrowed Row {
      var res: shared Row? = this.fetchone();
      while(res != nil) {
        yield res!;
        res = this.fetchone();
      }
    }

正如您所看到的,在一种情况下我返回借用的对象,而在其他情况下我返回共享的对象。有什么方法可以让我只返回一种类型,无论是共享的还是借用的,就像目前在这种情况下我收到错误一样。

        var res: Row? = cursor.fetchone();
        for row in cursor {
            res = row;
            //get row data by column name and print it.
            writeln("name = ", row["name"]," email = ", row["email"] );
        }

最佳答案

这个想法是类型转换。

override iter fetchall(): shared Row {
  var res: shared Row? = this.fetchone();
  while(res != nil) {
    try! {
      yield res: shared Row;
    }
    res = this.fetchone();
  }
}

关于memory-management - 如何在 Chapel 中产生一个 nilable 共享对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60873402/

相关文章:

c - 如何获取指针指向的内存大小?

C: 在特定内存位置访问 'char'?

regex - 迭代正则表达式捕获的生命周期问题

c++17: 一个从未被销毁的临时对象

dictionary - 如何在 Chapel 中表示集合或字典?

python - 如何在 Chapel 中双向查找类似字典的数据?

simulation - 相当于 Chapel 中 Octave 的 `meshgrid`

objective-c - 类和 block 的生命周期

c++ - C和C++中的动态内存分配和堆有什么区别

c++ - 对匿名右值的引用已损坏