考虑以下示例代码:
add
我们有一个简单的计数器枚举,有一个用于存储为Int计数器的情况。函数value
将给定的self
添加到print
中提取的计数器值,然后进行更新。
在延迟语句中有两个part A
,part B
在功能级别作用域,do
在本地print
块中作用域 - 否则,两个都打印记录什么值被添加到什么和最终输出将是什么。
根据代码,对于延迟[part B] do block defer: 10 + value(0) = value(0)
[part A] direct defer : 10 + value(0) = value(10)
s,输出看起来应该相同;然而,它们是不同的:
do
他们为什么不一样?
/site-disabled
块是否会捕获自身并将其传递给过早推迟,或者这是一个预期的设计还是需要注意的问题?
答案 0 :(得分:5)
此行为符合预期。
来自the Language Reference - Statements [强调我的]
推迟陈述
defer语句用于在传输之前执行代码 程序控制在延迟语句出现的范围之外 在强>
因此,当您的示例中的A
defer
被执行时,变异add(value:)
函数已完成其工作,因此增加self
(至10
)。 B
defer
语句放在do
正文中,而do
将add(value:)
转移程序控制回B
的直接范围时执行。因此,当执行defer
self
语句时,with t(class_id, student, marks) as (
select 1, 'tom,jam,tim', '55,65,75' from dual union all
select 2, 'rim,gum,ram', '33,66,77' from dual
)
select
t.class_id,
regexp_substr(student,'[^,]+',1,x.column_value) student,
regexp_substr(marks,'[^,]+',1,y.column_value) marks
from t, table(
cast(
multiset(
select level
from dual
connect by level <= regexp_count(t.student,',') + 1
) as sys.odcinumberlist
)
)x,table(
cast(
multiset(
select level
from dual
connect by level <= regexp_count(t.marks,',') + 1
) as sys.odcinumberlist
)
)y
尚未发生变异。