1

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();
};

Specman 中是否有类似于apply()不需要返回值的方法?

4

1 回答 1

2

我认为这里的基本问题是你想误用apply(). 我想说这个函数有一些函数式编程背景,它的目的是对列表的每个项目做一些事情并返回一个列表(比如map在 Python 或 Perl 中)。

如果您对函数调用的副作用感兴趣,如果函数不返回值,那么使用显式循环更正确。另请参阅使用 map() 与 for 是否有价值?

这表示我目前想不出不同的解决方案。也许包装foo()在一个返回值的函数中,但这绝对看起来超载。

于 2009-07-02T10:09:56.113 回答