1

我想编写一个复制任何类型列表的通用方法。我的代码:

copy_list(in_list : list of rf_type) : list of rf_type is {
    var out_list : list of rf_type;
    gen out_list keeping { it.size() == in_list.size(); };
    for each (elem) in in_list {
        out_list[index] = elem.unsafe();
    };
    result = out_list;
};

方法的调用:

var list_a : list of uint;
gen list_a;
var list_b : list of uint;
list_b = copy_list(list_a);

错误:

   ERR_GEN_NO_GEN_TYPE: Type 'list of rf_type' is not generateable
(it is not a subtype of any_struct) at line ...
        gen out_list keeping { it.size() == in_list.size(); };

此外,copy_list使用以下方法定义方法时也会出错list of untyped

Error: 'list_a' is of type 'list of uint', while expecting
type 'list of untyped'.

你能帮忙写一个复制列表的通用方法吗?感谢您的任何帮助

4

2 回答 2

4

我认为你在考虑你的方法。您应该只使用copy()伪方法:

extend sys {
  run() is also {
    var list1 : list of uint = { 1; 2; 3 };
    var list2 := list1;  // shallow copy, list2 points to list1
    var list3 : list of uint = list1.copy();

    list1.add(4);

    print list1, list2, list3;
  };
};

如果您运行该示例,您会看到list2它将包含一个 4 (因为它只是对 的引用list1,而list3不会(因为它是一个新列表,仅包含list1创建时包含的值)。

于 2015-03-29T12:43:38.423 回答
2

有什么理由不使用伪方法 .copy()?

var list_a : list of uint;
gen list_a;
var list_b : list of uint;
list_b = list_a.copy();
于 2015-03-29T12:44:37.500 回答