-
Notifications
You must be signed in to change notification settings - Fork 12
/
Copy pathlazy_operators.d
92 lines (66 loc) · 2.44 KB
/
lazy_operators.d
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
Ddoc
$(DERS_BOLUMU $(IX 惰性求值) 惰性运算符)
$(P
惰性求值即推迟表达式的执行,直到需要表达式的值。惰性求值是许多语言的基础特性。
)
$(P
如果结果最终并不需要,延迟求值自然可以让程序运行得更快。
)
$(P
$(IX 短路求值) 下面的运算符短路行为与惰性求值是相似的概念:
)
$(UL
$(LI $(IX ||, 短路) $(IX 逻辑或运算符) $(C ||) ($(I 或))运算符:第二个表达式只有在第一个表达式为 $(C false) 时才会执行。
---
if (anExpression() || mayNotBeEvaluated()) {
// ...
}
---
$(P
如果 $(C anExpression()) 的结果是 $(C true), 那么 $(C ||) 表达式的结果就一定是 $(C true)。因为我们不需要对第二个表达式求值来确定 $(C ||) 表达式的结果,所以第二个表达式不会被求值。
)
)
$(LI $(IX &&, 短路) $(IX 逻辑与运算符) $(C &&) ($(I 与))运算符:第二个表达式只有在第一个表达式为 $(C true) 时才会执行。
---
if (anExpression() && mayNotBeEvaluated()) {
// ...
}
---
$(P
如果 $(C anExpression()) 的结果是 $(C false),那么 $(C &&) 表达式的结果必然是 $(C false),因此第二个表达式不会被求值。
)
)
$(LI $(IX ?:, 短路) $(IX 三元运算符) $(IX 条件运算符) $(C ?:) ($(I 三元))运算符:第一个或第二个表达式是否被执行分别依赖于条件是 $(C true) 还是 $(C false)。
---
int i = condition() ? eitherThis() : orThis();
---
)
)
$(P
这些运算符的惰性不仅仅是与性能相关。有时,执行表达式会发生错误。
)
$(P
例如,如果字符串是空的,下面的条件$(I 第一个字符是 A) 会出错:
)
---
dstring s;
// ...
if (s[0] == 'A') {
// ...
}
---
$(P
为了正确的访问 $(C s) 的第一个元素,我们首先要确认字符串里的确有那个元素。因此,下面的条件把有潜在错误的逻辑表达式放在了 $(C &&) 运算符的右边,确保其只有在安全的情况下才执行:
)
---
if ((s.length >= 1) && (s[0] == 'A')) {
// ...
}
---
$(P
惰性求值可以通过 $(LINK2 /ders/d.cn/lambda.html, 函数指针, delegate) 完成,也可以用 $(LINK2 /ders/d.cn/ranges.html, range)。我们会在后面的章节见到这些。
)
Macros:
SUBTITLE=惰性运算符
DESCRIPTION=D 编程语言中的惰性(短路)运算符。
KEYWORDS=d 编程 语言 教程 惰性 lazy