3

私が見ているDelphiコードでは、次の一連の行が見つかりました。

const
    function1: function(const S: String): String = SomeVariable1;
    function2: function(const S: String): String = SomeVariable2;

これは何をしているのですか?つまり、関数内の実際のコードではなく、constセクション内で関数を宣言し、それを変数値と比較(?)するために何をしますか?Delphiの他の場所ではそれがどこにでもあるので、単一の等しいは比較であると思います。

ありがとうございました。

4

2 に答える 2

18

いいえ、これは定数が割り当てられる方法であるため、等号は割り当てです。たとえば、次のように考えてください。

const Pi = 3.1415;

また

const s = 'This is an example';

「型付き定数」もあります。

const Pi: extended = 3.1415;

上記のスニペットでは、 signature の関数を保持する型付き定数を定義していますfunction(const S: String): String。そして、(互換性のある) 関数SomeVariable1をそれに割り当てます。

SomVariable1たとえば、コードの早い段階で定義する必要があります。

function SomeVariable1(const S: String): String;
begin
  result := S + '!';
end;

次の例を検討してください。

function SomeVariable1(const S: String): String;
begin
  result := S + '!';
end;

const
  function1: function(const S: String): String = SomeVariable1;

procedure TForm1.FormCreate(Sender: TObject);
begin
  caption := function1('test');
end;
于 2011-04-07T15:34:59.963 に答える
8

アンドレアスの回答は技術的な部分を非常によくカバーしていますが、この部分に対する回答を提供したいと思います:

これは何をしているのですか?

の線に沿ってもっとWhy use this weired-looking construct?次の 2 つの理由が考えられます。

  • コードは{$J+}(代入可能な型付き定数) で記述されており、「定数」にはある時点で別の値が割り当てられます。変数として宣言されている場合function1、初期化はユニットのセクションで行う必要があり、initializationそれでは遅すぎる可能性があります (他のユニットのセクションがこのセクションの前に実行され、 「関数」initializationを呼び出そうとした場合)。function1
  • 関数名が から に変更され、function1簡単SomeVariable1に変更できないサードパーティ コードがある場合に使用されます。これにより、エイリアスを宣言する 1 行の方法が提供されます。
于 2011-04-07T16:02:31.603 に答える