VALUE怎么样?功能工作?

时间:2010-07-02 18:27:04

标签: undefined scope rebol rebol3

我已经将一些代码简化为一个小例子,它测试一个名为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?

4 个答案:

答案 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所做的。