有没有办法可以扩展e中列表的给定伪方法,添加一些特定的实现?
由于
答案 0 :(得分:3)
"伪方法"它不是一种真正的方法,它看起来就好像是一种方法。所以它不能用&#34来扩展;也是/ only / etc"。
但你可以定义任何"伪方法"你自己的,使用宏。
例如 - 只添加偶数项的伪方法 - (请注意()之前的\
define <my_pseudo_method'action> "<input1'exp>.add_if_even\(<input2'num>\)"
as computed {
result = append("if ", <input2'num>, " %2 == 0 then { ", <input1'exp>, ".add(", <input2'num>, ")};");
}
然后可以从另一个文件调用 -
extend sys {
run() is also {
var my_list : list of int;
for i from 0 to 10 {
my_list.add_if_even(i);
};
print my_list;
};
};
答案 1 :(得分:1)
使用宏,您甚至可以“覆盖”现有的伪方法。例如,假设您要修改add(),这样只有当元素不在列表中时才会向列表添加元素。 (换句话说,您希望保持列表中的所有元素唯一)。 你可以这样做:
define <my_add'action> "<list'exp>.add\(<exp>\)" as {
if not <list'exp>.has(it == <exp>) then {
var new_size<?>: int = <list'exp>.size() + 1;
<list'exp>.resize(new_size<?>, TRUE, <exp>, TRUE);
};
};
请注意,我在这里使用另一个伪方法 - resize() - 来实现向列表中实际添加新元素。如果我尝试使用add()伪方法本身,它将无法工作,并将导致无限递归。这是因为在宏内部使用的add()将再次调用宏本身,而不是覆盖预定义的伪方法。
答案 2 :(得分:1)
您还可以使用模板添加/修改列表伪方法。 e.g。
<'
template struct MyList of (<T1'type>) {
items: list of <T1'type>;
keep soft items.size()==10;
pop_index(i:int):<T1'type> is {
result = items[i];
items.delete(i);
};
};
extend sys {
list1: MyList of (byte);
// somehwere
var foo:= list1.pop_index(3);
};
'>