4

呼び出された変数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"

これは に対して true を返しますvalue? 'class-name。しかし、この 2 番目のケースでclass-name: default-class-nameは、まだ実行されていません。

value? 'class-nameclass-name はメモリに存在してはならないので、 false を返す必要があると思います。value?代わりに true を返すのはなぜですか?

4

4 に答える 4

2

を使用してfunctionいます。これにより、関数の本体がスキャンされ、NONE に初期化されたローカル変数が事前に作成されます。これvalue? 'class-nameが true になる理由です (NONE は変数の正当な値であり、「未設定」の状況とは異なるため)。

代わりに使用funcすると、両方とも false を返します。

于 2010-07-02T22:58:03.413 に答える
1

ここでは、FUNCTIONを使用していないが、それ以外はコードと同等の2つの例を示します。

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]しますが、2番目の例ではを生成します#[true]。これは、「未使用のリファインメント」(実際の呼び出しでは使用されないリファインメント)に続く「リファインメント引数」が#[none!]、リファインメント変数と一緒に初期化されるためです。/localこれは変数にも当てはまります。これは、/local改良が他の関数の改良と変わらないためです(ただし、ローカル変数を定義するためにそれを使用するのが慣例であるという事実を除いて)。

functionジェネレーターはこの/localメソッドを使用して「内部」でローカル変数を実装するため、上記の説明は、ジェネレーターが生成するすべての関数にも適用されます。

于 2010-07-17T11:51:15.987 に答える
1

functionと動作が異なるとは思いませんfunc /local。これらの例を見てください:

>> f: func [/x] [value? 'x]
>> f
== true

x に値を指定しませんでしたが、値があると表示されます。/local も同様

>> f: func [/local x] [value? 'x]
>> f
== true

変数をローカル (または絞り込み) にすると、既に値が設定されていることを意味し (これは何もありません)、それが実行されるからfunctionです。

于 2010-07-29T14:54:59.270 に答える
1

FUNC/LOCAL の使用を回避し、FUNCTION の使用を許可する別の方法があります。

つまり、SET-WORD を使用しないことです。割り当てのために。代わりに、LIT-WORD で SET 関数を使用してください。

ask-params: function [config-file [file!] default-class-name default-fields] [
    probe value? 'class-name
    input
    either (value? 'class-name) [
        probe class-name
    ] [
        set 'class-name default-class-name
    ]
]

あなたは機能を得るでしょ#[false]value?。ただし、SET の呼び出しclass-nameはグローバル環境で設定されます...ローカルとしてではありません。

于 2010-07-25T22:28:55.803 に答える