Specman使用apply()
方法对列表的所有元素执行相同的操作:
var a: list of int;
a = somefunction.that.returns.list.of.int();
var b:= a.apply(it * 2);
apply()
的作用与:
for each in a {
b.add(it.*2);
};
现在,如果我想在a
的元素上调用方法,只要方法返回一个值,我就可以使用apply()
。但是,如果我有:
struct bar {
x: int;
foo() is {
message(LOW, "x is ", x);
};
};
我试着这样做:
var a: list of bar;
a = somefunction.that.returns.list.of.bar();
a.apply(it.foo());
它无法编译,因为foo()
返回void
。相反,我必须使用显式循环:
for each in a {
it.foo();
};
是否有类似于apply()
的specman中的方法不需要返回值?
答案 0 :(得分:2)
我认为这里的基本问题是你想误用apply()
。我会说这个函数有一些函数式编程背景,它的目的是为列表中的每个项做一些事情并返回一个 new 列表(如map
in Python或Perl)。
如果您对函数调用的副作用感兴趣,如果函数没有返回值,那么使用显式循环更正确。另请参阅Is there a value in using map() vs for?
这说我现在想不出一个不同的解决方案。也许将foo()
包装在一个返回值的函数中,但这肯定会超载。