CODEBLOCK(代码块)类型是在 Clipper 时代的 XBase 语言中引入的。
它们可以被看作是无名函数。它们可以有 0 个或多个参数,并返回一个值。
最简单的返回字符串字面值的代码块如下所示:
FUNCTION Start() AS VOID
LOCAL cb AS CODEBLOCK
cb := {|| "Hello World"}
? Eval(cb)
WAIT
RETURN
要使用 CODEBLOCK(代码块),您需要调用 Eval() 运行时函数。
CODEBLOCK(代码块)不限于固定表达式,因为它们可以使用参数。
以下CODEBLOCK(代码块)添加了 2 个参数:
FUNCTION Start() AS VOID
LOCAL cb AS CODEBLOCK
cb := {|a,b| a + b}
? Eval(cb, 1,2)
? Eval(cb, "Helllo ", "World")
WAIT
RETURN
正如您在示例中所看到的,我们既可以在这里使用数字参数,也可以使用字符串参数。两者都可以。这是因为代码块的参数属于所谓的 USUAL 类型。它们可以包含任何值。当然,以下操作将失败,因为 USUAL 类型不支持字符串相乘:
FUNCTION Start() AS VOID
LOCAL cb AS CODEBLOCK
cb := {|a,b| a * b}
? Eval(cb, 1,2)
? Eval(cb, "Helllo ", "World")
WAIT
RETURN
代码块不仅限于单个表达式。
它们也可以包含一个(逗号分隔的)表达式列表。最后一个表达式的值是代码块的返回值。
FUNCTION Start() AS VOID
LOCAL cb AS CODEBLOCK
cb := {|a,b,c| QOut("value 1", a) , QOut("value 2", b), QOut("value 3", c), a*b*c}
? Eval(cb,10,20,30)
WAIT
RETURN
XSharp 还引入了包含语句列表的代码块:
FUNCTION Start() AS VOID
LOCAL cb AS CODEBLOCK
cb := {| a,b,c|
? "value 1" ,a
? "value 2" ,b
? "value 3" ,c
RETURN a*b*c
}
? Eval(cb,10,20,30)
WAIT
RETURN
•第一条语句应从参数列表后的新行开始。
•参数列表后不应有分号。
•语句列表应以 RETURN 语句结束。
CODEBLOCK 类型在抽象类 XSharp.Codeblock 中实现。
CODEBLOCK 的 Usualtype 值为 9。
在你的代码中,永远不会有 XSharp.Codeblock 类型的对象。
编译时代码块被转化为 XSharp.Codeblock 的子类。
运行时(宏编译)代码块被转换为 XSharp._Codeblock 类的子类,该类继承于 Codeblock。
根据运行时代码块的类型,它要么是宏代码块(MacroCodeblock)类的实例,要么是宏内存变量代码块(MacroMemVarCodeblock)类的实例(当宏创建动态内存变量时)。