我已经将一些代码简化为一个小例子,它测试一个名为class-name
的变量是否赋值给它:
ask-params: function [
config-file [file!]
default-class-name
default-fields
] [
probe value? 'class-name
input
either (value? 'class-name) [
probe class-name
] [
;-- omit code in this branch for now
]
]
ret-block: ask-params %simple-class.params.txt "Person" "First Name, Last Name"
表达式value? 'class-name
在这里返回false。另一方面,如果我用赋值填写缺少的分支:
ask-params: function [
config-file [file!]
default-class-name
default-fields
] [
probe value? 'class-name
input
either (value? 'class-name) [
probe class-name
] [
class-name: default-class-name
]
]
ret-block: ask-params %simple-class.params.txt "Person" "First Name, Last Name"
value? 'class-name
将返回true。但在第二种情况下,class-name: default-class-name
甚至尚未执行。
我认为类名不应该存在于内存中,因此value? 'class-name
应该返回false。为什么value?
会返回true?
答案 0 :(得分:2)
您正在使用function
。这将扫描函数体并为您预先创建局部变量,初始化为NONE。这就是value? 'class-name
变为真的原因(因为NONE是变量的合法值,与“未设置”的情况不同)。
如果你使用了func
,那么两者都会返回false。
答案 1 :(得分:1)
这里我向您展示两个不使用FUNCTION的示例,但在其他方面等同于您的代码:
ask-params: func [config-file [file!] default-class-name default-fields] [
probe value? 'class-name
input
either (value? 'class-name) [
probe class-name
][
]
]
ask-params: func [
config-file [file!] default-class-name default-fields /local class-name
] [
probe value? 'class-name
input
either (value? 'class-name) [
probe class-name
][
]
]
虽然第一个示例中的value?
函数会产生#[false]
,但在第二个示例中,它会产生#[true]
。这是因为“未使用的细化”(在实际调用中未使用的细化)之后的“细化参数”与细化变量一起初始化为#[none!]
。这也适用于/local
变量,因为/local
细化与其他函数细化没有区别(事实上,使用它来定义局部变量是一种惯例)。
由于function
生成器使用/local
方法在“引擎盖下”实现局部变量,因此以上描述也适用于它生成的所有函数。
答案 2 :(得分:1)
答案 3 :(得分:1)
我认为function
的行为与func /local
不同。看看这些例子:
>> f: func [/x] [value? 'x]
>> f
== true
我没有给x任何值,但它说它有一个值。 / local
相同>> f: func [/local x] [value? 'x]
>> f
== true
因为当你创建一个变量local(或一个细化)时,它意味着你已经为它设置了一个值(没有),这就是function
所做的。