当我在脑海里练习这个例子时,我得到了4 8 3
的输出。当我运行该函数但是得到输出4 8 6
时,我理解如何获得4
和8
,但我无法理解y = 6
的方式。不应该y = 3
吗?运行a1
会导致y +=1
因此y = 1
然后a2
会运行,从而产生y+=2
y = 3
。
void Main() {
int y = 0;
Func<int,bool> even = (n) => { return n%2 == 0; };
Func<int,int> dub = (n) => { y += 2; return n + n; };
Func<int,int> succ = (n) => { y += 1; return n + 1; };
Func<bool, int, int, int> if1 = (c, t, f) => c? t: f;
y = 0;
var a1 = if1(even(3), dub(3), succ(3));
var a2 = if1(even(4), dub(4), succ(4));
Console.WriteLine("{0} {1} {2}", a1, a2, y);
}
答案 0 :(得分:4)
尽管turn=10-sum(state==0);
中的条件表达式仅使用if1
或t
,但发送到f
的值始终会在调用之前计算。
要仅在需要时计算值,您可以将代理发送给函数,而不是值:
if1
答案 1 :(得分:2)
您必须在此处意识到,对if1
的两次调用都会传递dub
和succ
的返回值(因为您实际上称之为var a1 = if1(even(3), dub(3), succ(3));
var a2 = if1(even(4), dub(4), succ(4));
)。
if1
这意味着无论是否使用返回值(由y
确定),方法都已运行,并已修改dub
。这就是为什么它是6,因为succ
和library(gsubfn)
m <- strapply(a, '(.*)/(.*)', ~ c(FPath=x, FileName=y), simplify=rbind)
Final <- as.data.frame(m, stringsAsFactors = FALSE)
被程序调用了两次,而2 + 2 + 1 + 1 = 6